- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在我的应用中使用正交投影来显示 3D 场景。在我的代码中,我在场景中放了一个盒子,并像打击一样设置了 Point of View 的正交投影。 (0,0,500) 处的相机看向 -z 方向,盒子位于世界原点。所以相机应该能够捕捉到盒子。
let cameraNode = SCNNode()
let pov = SCNCamera()
pov.usesOrthographicProjection = true
let width = UISreen.main.bounds.size.width
let glMat = GLKMatrix4MakeOrtho(-width/2, width/2, -width/2, width/2, 1, 1000)
pov.projectionTransform = SCNMatrix4FromGLKMatrix4(glMat)
cameraNode.camera = pov
cameraNode.position = SCNVector3.init(0, 0, 500)
scene.rootNode.addChildNode(cameraNode)
let boxGeo = SCNBox.init(width: 100, height: 100, length: 1, chamferRadius: 0)
let box = SCNNode.init(geometry: boxGeo)
scene.rootNode.addChildNode(box)
但我什么也看不见。我发现如果将 orthographicScale
设置为 width/2.0
将正常工作。
pov.orthographicScale = Double(width/2);
问题 1: 我不知道为什么会这样。我阅读了苹果的文档,但仍然感到困惑。 https://developer.apple.com/documentation/scenekit/scncamera/1436612-orthographicscale?language=objc
orthographicScale
Specifies the camera’s magnification factor when using an orthographic projection.
为什么我需要放大正交投影?我已经通过 GLKMatrix4MakeOrtho
设置了它的维度。
我不确定它是否与视口(viewport)变换有关?因为 OpenGL 中的视口(viewport)变换计算如下:https://learn.microsoft.com/en-us/windows/desktop/opengl/glviewport
问题 2:我还发现,如果我像 blow 一样创建投影矩阵,它的工作方式与以前一样。
let glMat = GLKMatrix4MakeOrtho(0, width, 0, width, 1, 1000)
在OpenGL中表示不同的viewing box,会显示不同的场景分区。
感谢任何帮助!
最佳答案
我想,您无法使用 GLKMatrix4MakeOrtho
在场景中看到您的 3D 对象,因为现在有太多适用于 iOS 和 macOS 的 GLKit 类已被弃用。
为了查看您的 3D 对象,您需要在 Attributes Inspector
中手动设置 Far Z Clipping
参数。这两个字段是正交相机视锥体的near
和far
裁剪平面。默认值 Far=100
不允许您看到超过 100 个单位的场景。
Then use a
Scale
property to set a scale factor for your objects in an ortho view.
为了通过 GLKMatrix4MakeOrtho
以编程方式使用它,您需要导入 GLKit
和 OpenGL
模块(以及所有必要的委托(delegate)协议(protocol)) 首先进入您的项目。
import GLKit
import OpenGL
// Obj-C GLKMatrix4
GLK_INLINE GLKMatrix4 GLKMatrix4MakeOrtho(float left,
float right,
float bottom,
float top,
float nearZ,
float farZ) {
float ral = right + left;
float rsl = right - left;
float tab = top + bottom;
float tsb = top - bottom;
float fan = farZ + nearZ;
float fsn = farZ - nearZ;
GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,
0.0f, 2.0f / tsb, 0.0f, 0.0f,
0.0f, 0.0f, -2.0f / fsn, 0.0f,
-ral / rsl, -tab / tsb, -fan / fsn, 1.0f };
return m;
}
Also, on iOS, GLKit requires an OpenGL ES 2.0 context. In macOS, GLKit requires an OpenGL context that supports the OpenGL 3.2 Core Profile.
但请记住!许多 GL 功能已弃用,因此您最好使用 Metal
框架。 Look at deprecated classes of GLKit .
关于ios - 对 SceneKit 中相机的正交投影感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52428397/
我有一个由给定时刻的一组节点组成的图。该图可能会随着时间的推移而演变,即节点之间的关系以及节点本身可能会发生变化。 绘图必须是正交绘图。 我想画出图表的演变过程,即在不同的时刻绘制图表的图像,尝试从一
我有一个由 graphviz 工具制作的无向图(现在我正在使用 sfdp ): digraph structs { node [shape=Mrecord, URL="index_ne
我有一个世界地图的正交投影,在 D3 中并使用 TopoJSON。我通过调用此代码为每次加载数据的国家/地区着色。 地球在不停地旋转。 我的问题是,在旋转过程中我收到错误消息: 错误 >> 错误:在
我是 opencv 和 c++ 的新手,一直在尝试确定两条线是否几乎相互垂直/正交。有这个公式可以确定它们是否完全正交(m1*m2 = -1),而 m1 是第一个直线的斜率,m2 是第二个直线的斜率。
悬停时按钮会翻转但无法显示透视图。这就像动画的平面正交 View 。我使用的 perspective 属性有误吗? @import 'https://necolas.github.io/normali
我正在尝试使用高斯积分来近似函数的积分。 (更多信息在这里:http://austingwalters.com/gaussian-quadrature/)。第一个函数在区间 [-1,1] 上。第二个函
我在使用 opengl 绘制简单的 2d 纹理四边形时遇到了 z fighting 的一些问题。症状是两个物体以相同的速度移动,一个在另一个上面,但周期性地一个可以看穿另一个,反之亦然 - 有点像“闪
我正在尝试在背景图像(正交投影)顶部使用 Frustum 投影渲染一些网格。无论我做什么,背景图像始终位于场景顶部(隐藏网格)。 我尝试了一个小测试 - 当我用相同的投影矩阵渲染它们时 以正确的顺序
我是一名优秀的程序员,十分优秀!