gpt4 book ai didi

objective-c - NSGraphicsContext 透视图

转载 作者:行者123 更新时间:2023-12-03 17:11:40 27 4
gpt4 key购买 nike

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

注意:我没有使用 NSViews 或 Layers。

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

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

Screenshot

我是否可以设置 NSGraphicsContext 转换,例如:

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

或者我需要切换到使用 OpenGL 吗?

谢谢!

最佳答案

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

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

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

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

或者,如果您愿意,您可以使用 OpenGL,这就是核心动画在幕后要做的事情。当您只想做一些基本的事情时,这是很多代码。

关于objective-c - NSGraphicsContext 透视图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23030247/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com