如何将摄像头指向iOS 11下方的SConverctor3点
昨天我刚开始学习如何使用如何将摄像头指向iOS 11下方的SConverctor3点,ios,swift,scenekit,trigonometry,Ios,Swift,Scenekit,Trigonometry,昨天我刚开始学习如何使用SceneKit,所以我可能会弄错或弄错一些东西。我试图让我的cameraNode查看场景中的scconvertor3点 我正在尝试让iOS 11.0下的人可以使用我的应用程序。但是,look(at:)功能仅适用于iOS 11.0+ 以下是我初始化相机的功能: func initCamera() { cameraNode = SCNNode() cameraNode.camera = SCNCamera() cameraNode.position
SceneKit
,所以我可能会弄错或弄错一些东西。我试图让我的cameraNode
查看场景中的scconvertor3
点
我正在尝试让iOS 11.0下的人可以使用我的应用程序。但是,look(at:)
功能仅适用于iOS 11.0+
以下是我初始化相机的功能:
func initCamera() {
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(5, 12, 10)
if #available(iOS 11.0, *) {
cameraNode.look(at: SCNVector3(0, 5, 0)) // Calculate the look angle
} else {
// How can I calculate the orientation? <-----------
}
print(cameraNode.rotation) // Prints: SCNVector4(x: -0.7600127, y: 0.62465125, z: 0.17941462, w: 0.7226559)
gameScene.rootNode.addChildNode(cameraNode)
}
func initCamera(){
cameraNode=SCNNode()
cameraNode.camera=SCNCamera()
cameraNode.position=SCInvector3(5、12、10)
如果可用(iOS 11.0,*){
look(at:scinvector3(0,5,0))//计算视角
}否则{
//如何计算方向?在SceneKit中有三种表达3D旋转的方法:
你在纸上所做的是计算围绕x、y和z轴的单独角度。这些角度被称为俯仰、偏航和滚动。如果你使用eulerAngles
或代替“旋转”,你可能会得到更类似于手工计算的结果。(或者您可能不会,因为欧拉角度系统的困难之一是您必须以正确的顺序应用这三个旋转中的每一个。)
或rotation
使用四分量向量(float4
或scinvector4
)这依赖于一点数学知识,这对于许多3D图形新手来说并不明显:围绕不同轴的任何旋转序列的结果都可以最低限度地表示为围绕一个新轴的单个旋转
例如,围绕z轴(0,0,1)旋转π/2弧度(90°),然后围绕y轴(0,1,0)旋转π/2,其结果与围绕轴(-1)旋转2π/3的结果相同/√3, 1/√3, 1/√3)
这是您对场景的x、y、z和w分量感到困惑的地方。it旋转
向量-前三个分量是长度,表示3D向量,第四个分量是围绕该向量的弧度旋转
是表达3D旋转的另一种方式(对于我们这些接受正规数学教育的人来说,这种方式甚至比传统的方式更加离经叛道,这在本科计算机科学课程中很常见,但也不是疯狂的高级课程)。这些具有许多用于3D图形的强大功能,例如易于合成和在两者之间插值。在SceneKit中,ororientation
属性允许您将节点的旋转作为四元数处理
解释四元数如何工作对于一个如此简单的答案来说太难了,但实际的结果是:如果你使用的是一个好的向量数学库(如),你基本上可以将它们视为不透明的-只需从对你来说最容易的其他旋转表示转换,并获得好处
虽然@rickster已经解释了节点的属性,但我已经找到了一种方法,可以使用数学(三角法)旋转节点以查看点
这是我的密码:
// Extension for Float
extension Float {
/// Convert degrees to radians
func asRadians() -> Float {
return self * Float.pi / 180
}
}
而且:
// Extension for SCNNode
extension SCNNode {
/// Look at a SCNVector3 point
func lookAt(_ point: SCNVector3) {
// Find change in positions
let changeX = self.position.x - point.x // Change in X position
let changeY = self.position.y - point.y // Change in Y position
let changeZ = self.position.z - point.z // Change in Z position
// Calculate the X and Y angles
let angleX = atan2(changeZ, changeY) * (changeZ > 0 ? -1 : 1)
let angleY = atan2(changeZ, changeX)
// Calculate the X and Y rotations
let xRot = Float(-90).asRadians() - angleX // X rotation
let yRot = Float(90).asRadians() - angleY // Y rotation
self.eulerAngles = SCNVector3(CGFloat(xRot), CGFloat(yRot), 0) // Rotate
}
}
您可以使用以下命令调用函数:
cameraNode.lookAt(SCNVector3(0, 5, 0))
希望这对未来的人们有所帮助!是的,这很有效。请注意,如果动画持续时间为零,则SCNAction.rotateTo
相当于直接设置euleranges
。