我有一些代码,包含用于获取标题的委托方法和转换.我取标题并将其转换为弧度并使用角度围绕y轴旋转:
? ?
Y = | cos(ry) 0 sin(ry) 0 |
| 0 1 0 0 |
| -sin(ry) 0 cos(ry) 0 |
| 0 0 0 1 |
? ?
SCNMatrix4的前两列是什么?
码:
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
print("received heading: \(String(describing: newHeading))")
self.currentHeading = newHeading
print("\(Float(currentHeading.trueHeading)) or for magneticHeading: \(currentHeading.magneticHeading)")
let headingInRadians = degreesToRadians(deg: Float(currentHeading.trueHeading))
print("\(headingInRadians) -------- headingInRadians")
var m = matrix_float4x4()
m.columns.3 = [0.0, 0.0, 0.0, 1.0]
m.columns.2 = [sin(headingInRadians), 0.0, cos(headingInRadians), 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [cos(headingInRadians), 0.0, -sin(headingInRadians), 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
}
它在我打电话时删除所有节点setWorldOrigin
.我已经尝试暂停会话,运行该功能,然后再次启动会话,我得到这个奇怪的低fps,低光情况.我知道这是函数调用,setWorldOrigin
因为当我删除它时,我看到节点,它们仍然存在.
UPDATE
我一直在研究这个...我正在通过简单地尝试将比例改为2进行调试......我应该看到的是,我放置在网格中的节点应该分散...但是我仍然得到相同的结果.尝试setWorldOrigin
删除节点后.使用此功能会重置某些内容吗?我应该使用它吗?(一些代表职能)?
UPDATE
print("\(sceneView.scene.rootNode) --- rootNode in renderer")
生产:
--- rootNode in renderer
所以看来它rootNode
和它children
仍然在某个地方......但它们在哪里进行如此简单的小变换呢?
UPDATE
print("\(sceneView.scene.rootNode.position) --- rootNode in renderer")
生产:
SCNVector3(x: 0.0, y: 0.0, z: 0.0) --- rootNode in renderer
然而......我没有看到任何一个孩子......所以rootNode似乎在其他地方.
UPDATE
我可以确认转换没有发生......子节点(我看不到)的位置仍然与其原始状态(每2个网格块(米)的节点相同,即:
SCNVector3(x: 6.0, y: 0.0, z: -4.0) --- rootNode child node
SCNVector3(x: 6.0, y: 0.0, z: -2.0) --- rootNode child node
UPDATE
我现在对这个问题的最狭隘观点是,即使是简单的旋转也会从视图中移除节点......因为没有位置变化......这意味着我认为渲染过程正在发生一些事情.
func viewDidLoad() {
...
sceneView.scene = scene
view.addSubview(sceneView)
let angle = coordinateConverter.getUprightMKMapCameraHeading()
print("\(angle) --- angle")
mRotate = matrix_float4x4()
mRotate.columns.3 = [0.0, 0.0, 0.0, 1.0]
mRotate.columns.2 = [Float(sin(angle)), 0.0, Float(cos(angle)), 0.0]
mRotate.columns.1 = [0.0, 0.0, 0.0, 0.0]
mRotate.columns.0 = [Float(cos(angle)), 0.0, Float(-sin(angle)), 0.0]
sceneView.session.setWorldOrigin(relativeTransform: mRotate)
控制台输出:
281.689248803283 --- angle
尽管如此,虚拟对象仍然不可见,但放置在原点......它应该仍然是相同的.
我还应该注意标准1,1,1,1变换DOES工作......但很明显,它什么也没做......但我想只是使用这个功能不会让它们消失......它们只会消失转换实际上做了什么......
...
var identity = matrix_float4x4()
identity.columns.3 = [0.0, 0.0, 0.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: identity)
...
上面没有变换......并且节点保持在视图中.
如果我将矩阵更改为此(翻译10,10):
var identity = matrix_float4x4()
identity.columns.3 = [10.0, 0.0, 10.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]
有用...
我只是想......我必须缩小我的世界(现实世界的MKMapKit坐标/单位)可能是因为硬件无法处理缩放的世界.另外,从上面的测试...我想我已经意识到当你使用这个函数时原点会移动,但是节点没有,所以如果我希望节点在转换后保持在我的位置......我需要把它们变回来.不过,结果是一样的:
print("\(transformerFromPDFToMk.tx) -- tx")
print("\(transformerFromPDFToMk.ty) -- ty")
m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx), 0.0, Float(transformerFromPDFToMk.ty), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
for node in scene.rootNode.childNodes {
node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) + node.position.x, node.position.y, Float(transformerFromPDFToMk.ty) + node.position.z)
}
控制台输出:
81145547.3824476 -- tx
99399579.5362287 -- ty
UPDATE
我看到了我的对象(有点)!我以为我之前尝试过这个...但它现在工作得更好 - 我使用的代码包定义了一个scale(coordinateConverter.unitSizeInMeters
)......而且我正在转换它不正确.但是......他们快速地闪烁着......
m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx) / Float(coordinateConverter.unitSizeInMeters), 0.0, Float(transformerFromPDFToMk.ty) / Float(coordinateConverter.unitSizeInMeters), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
sceneView.session.setWorldOrigin(relativeTransform: m)
for node in scene.rootNode.childNodes {
node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) /
Float(coordinateConverter.unitSizeInMeters) + node.position.x /
Float(coordinateConverter.unitSizeInMeters), node.position.y /
Float(coordinateConverter.unitSizeInMeters), -
Float(transformerFromPDFToMk.ty) /
Float(coordinateConverter.unitSizeInMeters) + node.position.z /
Float(coordinateConverter.unitSizeInMeters))
}
UPDATE
闪烁的"z-fighting"?https://en.wikipedia.org/wiki/Z-fighting