在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];
}发布于 2012-11-18 12:12:01
我一直在做这个实验。到目前为止,我所发现的最好的方法是记录内部状态的输入键的状态,并运行NSTimer来应用它们。计时器使用两次发射之间的实际测量时间增量来确定相机移动的距离。这样,不规则的计时不会有太大的影响(而且我可以随时调用我的方法来更新相机的位置,而不用担心改变它的移动速度)。
不过,要让它正确运行,还需要做一些工作。keyDown:和keyUp:当涉及到游戏输入时,有一些令人讨厌的行为。例如,重复键。此外,如果在过渡过程中按住键,即使在视图失去焦点或应用程序转到后台后,它们也可能会触发。等。不是不可逾越的,但很烦人。
我还没有做的是添加加速和减速,我认为这将有助于感觉它是流畅的。除此之外,感觉还不错。
发布于 2012-09-26 17:57:48
要最小化脉冲移动(由于按键重复),您可以使用"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];也就是说,在这里做的最好的事情可能是自己管理一个目标位置(一个vector3),并在每一帧更新相机的位置,以顺利地到达这个目标。
发布于 2019-05-29 18:35:20
我使用以下代码移动摄像头:
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 += lerpZhttps://stackoverflow.com/questions/12593128
复制相似问题