首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSGraphicsContext视角

NSGraphicsContext视角
EN

Stack Overflow用户
提问于 2014-04-12 12:15:55
回答 2查看 235关注 0票数 1

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

备注:我不使用NSViews或图层。

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

这是一个矩形的截图,在y axis...but周围旋转45.0,看起来是扁平的。

我是否可以将NSGraphicsContext转换设置为:

代码语言:javascript
复制
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0 / -500.0;

还是我需要切换到使用Open?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-04-12 12:40:29

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

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

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

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

或者你可以使用OpenGL,如果你愿意,这是核心动画将做什么无论如何在罩下。但是,当您只想做一些基本的事情时,这是大量的代码。

票数 2
EN

Stack Overflow用户

发布于 2014-04-17 20:01:23

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

xyzw_coord = NDC *投影矩阵*视图矩阵*模型转换。

构建以(0,0,0)为NSView中心的模型转换。在Y上建立只旋转的视图矩阵,用正交投影构造投影矩阵。NDC = x,y,z,w,w= 1。

final_coord = (xy_coord.x/w *宽度,xy_coord.y/w *高度)。

数学是很有趣的(阅读挫折)来实现。但令人欣慰的是。但是我同意Abhi的观点,如果你使用核心动画或者更好的新苹果SceneKit,那就更好了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23030247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档