NSGraphicsContext透视图

时间:2014-04-12 12:15:56

标签: objective-c cocoa drawrect

我在drawRect方法中绘制了一些形状。

注意:我没有使用NSView或图层。

我正在将我的形状点转换为3d然后将它们绘制到屏幕上......但它们缺乏深度。

这是围绕y轴以45.0旋转绘制的矩形的屏幕截图...但它看起来很平常

Screenshot

无论如何,我可以将NSGraphicsContext变换设置为:

CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0 / -500.0;

或者我是否需要切换到使用Open-GL?

谢谢!

2 个答案:

答案 0 :(得分:1)

我可能错了,我不是专家,但CATransform是核心动画的一部分,它是一个高级绘图框架。当您使用drawRect:时,您正在直接使用图形上下文,这是一个低级绘图API(根据Apple的文档,它看起来像Core Graphics(因此drawRect :)直接与GPU硬件对话,绕过OpenGL )。因此,如果你想在drawRect中使用CATransform3D,你需要自己实现核心动画:。

但是你可以选择你想要的核心动画部分,而不是使用一切。例如,您可以创建一个CALayer对象(或者可能是CAShapeLayer),应用转换,并告诉它在drawRect实现的当前上下文中绘制。

尽量避免在drawRect:中创建图层,因为如果可能的话,drawRect:方法应该在几千秒内执行。您可以在第一次绘制时创建图层,但后续绘制应该重复使用在先前绘制操作中创建的图层。此外,如果你得到一个低记忆警告,你应该扔掉所有图层,以便下次绘图时可以重新创建它们。否则,当应用程序处于前台时,您的应用程序可能会在后台运行时终止,或者甚至在用户没有任何错误消息时崩溃。

或者你可以完全避免使用drawRect:并且全程使用核心动画。我就是做这个的。如果我需要自定义绘图,我将子类化为CALayer。

或者你可以根据需要使用OpenGL,这就是核心动画无论如何都要做的事情。当你只想做一些基本的事情时,这是很多代码。

答案 1 :(得分:0)

我假设您可以通过将任意z值为0的3D坐标转换为最终屏幕坐标来解决此问题

  

xyzw_coord = NDC *投影矩阵*查看矩阵*模型变换。

构建模型转换,其中(0,0,0)是NSView的中心。 只需在Y上旋转即可构建视图矩阵。 使用正交投影构建投影矩阵。 NDC = [x,y,z,w]。 w = 1。

final_coord =(xy_coord.x / w * width,xy_coord.y / w * height)。

数学实现很有趣(阅读挫折)。但它令人欣慰。但我同意Abhi,如果你使用核心动画或更好的新Apple SceneKit,它会更好!

相关问题