在SceneKit(OpenGL)中平滑移动相机的标准方法是什么? 手动改变x,y不够平滑,但使用CoreAnimation会产生“脉冲”运动。 SceneKit上的文档似乎非常有限,所以任何例子都会受到赞赏,我现在正在这样做:
- (void)keyDown:(NSEvent *)theEvent {
int key = [theEvent keyCode];
int x = cameraNode.position.x;
int y = cameraNode.position.y;
int z = cameraNode.position.z;
int speed = 4;
if (key==123) {//left
x-=speed;
} else if (key==124) {//right
x+=speed;
} else if (key==125) {//down
y-=speed;
} else if (key==126) {//up
y+=speed;
}
//move the camera
[SCNTransaction begin];
[SCNTransaction setAnimationDuration: 1.0];
// Change properties
cameraNode.position = SCNVector3Make(x, y, z);
[SCNTransaction commit];
}
答案 0 :(得分:8)
为了减少脉冲运动(由于键重复),您可以使用“easeOut”timingFunction:
//move the camera
[SCNTransaction begin];
[SCNTransaction setAnimationDuration: 1.0];
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
// Change properties
cameraNode.position = SCNVector3Make(x, y, z);
[SCNTransaction commit];
那就是说,这里最好的办法就是自己管理一个目标位置(一个矢量3)并在每一帧更新摄像机的位置,以便顺利地到达目标。
答案 1 :(得分:1)
我一直在试验这个。到目前为止我发现的最好的是记录内部状态的输入键的状态,由keyDown:和keyUp:修改,并运行NSTimer来应用它们。计时器使用点火之间的实际测量时间增量来确定相机移动的距离。这样不规则的时间不会产生太大的影响(我可以随时调用我的方法更新摄像机位置,而不必担心改变其移动速度)。
但要使这种行为正确,需要做一些工作。 keyDown:和keyUp:在游戏输入方面有一些令人讨厌的行为。例如,重复键。此外,即使您的视图失去焦点或应用程序转到后台,如果按键在转换过程中按下,它们也可能会触发。等等。不是不可克服的,但令人讨厌。
我还没有做的是添加加速和减速,我认为这将有助于感觉它是平滑的。否则感觉还不错。
答案 2 :(得分:0)
我使用以下代码移动相机:
let lerpX = (heroNode.position.x - followCamera.position.x) * 0.05
let lerpZ = (heroNode.position.z - followCamera.position.z) * 0.05
followCamera.position.x += lerpX
followCamera.position.z += lerpZ