换个角度问题
changing point of view issue
我在场景工具包中遇到意外改变视角的问题。
在调试时我可以看到 self.sceneView.pointOfView
有以前的相机节点并且设置新的相机节点不会影响屏幕上的任何内容。即使没有 setCompletionBlock
,它也会意外发生。有时它发生在第一次改变观点之后,而其他时候则发生在很晚的时候。之后无法更改,我必须终止并重新启动才能使其正常工作。知道我做错了什么吗?接收到 NSNotification
后触发以下代码
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:4];
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
MenuEntery *menu = [notification object];
switch (menu.menuEntryType)
{
case kMenuS:
{
self.sceneView.pointOfView = _cameraNodeForS;
[SCNTransaction setCompletionBlock:^{
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:2];
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
self.sceneView.pointOfView = _cameraNodeForS2;
[SCNTransaction commit];
}];
break;
}
//and other cases will here in between
}
[SCNTransaction commit];
编辑:相机
_cameraNodeForS = [SCNNode node];
_cameraNodeForS.camera = [SCNCamera camera];
_cameraNodeForS.position = SCNVector3Make(0, 0, S_DIST);
_cameraNodeForS.camera.xFov = 50;
_cameraNodeForS.camera.zFar = 2100000;
_cameraNodeForS.camera.aperture = 1/50;
_cameraNodeForSOrbit = [SCNNode node];
[_cameraNodeForSOrbit addChildNode:_cameraNodeForS];
_cameraNodeForS2 = [SCNNode node];
_cameraNodeForS2.camera = [SCNCamera camera];
_cameraNodeForS2.position = SCNVector3Make(0, 0, 10000);
_cameraNodeForS2.camera.xFov = 50;
_cameraNodeForS2.camera.zFar = 2100000;
_cameraNodeForS2.camera.aperture = 1/50;
_cameraNodeForS2Orbit = [SCNNode node];
[_cameraNodeForS2Orbit addChildNode:_cameraNodeForS2];
这就是我解决问题的方法。先说项目。我有一个 SCNView
,其中有 SKScene
和 UITableViewController
。 table 包含指向场景中节点的不同单元格的菜单。每个节点都有自己的摄像头。如果用户选择了一个菜单条目,那么视点将更改为该对象的带有动画的相机,如问题中所述。除了动画相机到相机的变化外,我还必须在用户在屏幕上触摸和拖动时为相机轨道制作动画。所以我在开始时使用了 SCNTransaction
但不知何故错误地禁用了 [SCNTransaction commit];
行。重新吸取教训,每 "begin" 需要 "commit",否则会发生意外行为。(解决方案提醒我忘记提交 sqlite 插入或更新)。
我在场景工具包中遇到意外改变视角的问题。
在调试时我可以看到 self.sceneView.pointOfView
有以前的相机节点并且设置新的相机节点不会影响屏幕上的任何内容。即使没有 setCompletionBlock
,它也会意外发生。有时它发生在第一次改变观点之后,而其他时候则发生在很晚的时候。之后无法更改,我必须终止并重新启动才能使其正常工作。知道我做错了什么吗?接收到 NSNotification
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:4];
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
MenuEntery *menu = [notification object];
switch (menu.menuEntryType)
{
case kMenuS:
{
self.sceneView.pointOfView = _cameraNodeForS;
[SCNTransaction setCompletionBlock:^{
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:2];
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
self.sceneView.pointOfView = _cameraNodeForS2;
[SCNTransaction commit];
}];
break;
}
//and other cases will here in between
}
[SCNTransaction commit];
编辑:相机
_cameraNodeForS = [SCNNode node];
_cameraNodeForS.camera = [SCNCamera camera];
_cameraNodeForS.position = SCNVector3Make(0, 0, S_DIST);
_cameraNodeForS.camera.xFov = 50;
_cameraNodeForS.camera.zFar = 2100000;
_cameraNodeForS.camera.aperture = 1/50;
_cameraNodeForSOrbit = [SCNNode node];
[_cameraNodeForSOrbit addChildNode:_cameraNodeForS];
_cameraNodeForS2 = [SCNNode node];
_cameraNodeForS2.camera = [SCNCamera camera];
_cameraNodeForS2.position = SCNVector3Make(0, 0, 10000);
_cameraNodeForS2.camera.xFov = 50;
_cameraNodeForS2.camera.zFar = 2100000;
_cameraNodeForS2.camera.aperture = 1/50;
_cameraNodeForS2Orbit = [SCNNode node];
[_cameraNodeForS2Orbit addChildNode:_cameraNodeForS2];
这就是我解决问题的方法。先说项目。我有一个 SCNView
,其中有 SKScene
和 UITableViewController
。 table 包含指向场景中节点的不同单元格的菜单。每个节点都有自己的摄像头。如果用户选择了一个菜单条目,那么视点将更改为该对象的带有动画的相机,如问题中所述。除了动画相机到相机的变化外,我还必须在用户在屏幕上触摸和拖动时为相机轨道制作动画。所以我在开始时使用了 SCNTransaction
但不知何故错误地禁用了 [SCNTransaction commit];
行。重新吸取教训,每 "begin" 需要 "commit",否则会发生意外行为。(解决方案提醒我忘记提交 sqlite 插入或更新)。