在 Three.js 中使用 Orbit Controls 旋转相机时出现奇怪的晃动
Strange shaking while rotating the camera with Orbit Controls in Three.js
我正在制作太阳系模型。这是我当前的指标:
scale = 0.001;
// 1 unit - 1 kilometer
var AU = 149597871 * scale;
这就是我定义相机、渲染器和控件的方式:
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1 * scale, 0.1 * AU);
renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
controls = new THREE.OrbitControls(camera, renderer.domElement);
然后我让用户可以选择在对象之间跳转,所以这就是我在用户选择 planet/moon 后设置相机的方式:
function cameraGoTo() {
for (var i = scene.children.length - 1; i >= 0 ; i--) {
var obj = scene.children[i];
if (obj.name == parameters.selected) {
controls.target = obj.position;
camera.position.copy(obj.position);
camera.position.y += obj.radius * 2;
}
}
}
问题是对于小的planets/moons(半径 <= 1000 公里)相机在围绕物体旋转时晃动。我只有计算机图形学的基础知识,所以我不知道这是 Orbit Controls 的问题还是它与渲染器本身有关......所以我尝试设置 logarithmicDepthBuffer = true
但它没有帮助。同样尝试不同的 scale
并没有改变任何东西。
提前感谢任何help/clues。
编辑:
这是 fiddle:
http://jsfiddle.net/twxyz/8kxcdkjj/
您可以看到晃动随着以下任何一项而增加:
- 物体越小,
- 物体离原点越远,
这是什么原因?很明显它似乎与相机 near/far 光谱值无关,但与物体距场景中心的距离有关。
我想出了解决办法。
我的问题是处理对象远离原点时的浮点精度错误。事实证明这是一个众所周知的问题,并且有多种解决方案。我用过这个:
http://answers.unity3d.com/questions/54739/any-solution-for-extreamly-large-gameworlds-single.html
发生的事情基本上不是移动 camera/player,而是相对于始终位于原点的 camera/player 变换 整个场景 。在这种情况下,Orbit Controls 的目标始终是原点。
我正在制作太阳系模型。这是我当前的指标:
scale = 0.001;
// 1 unit - 1 kilometer
var AU = 149597871 * scale;
这就是我定义相机、渲染器和控件的方式:
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1 * scale, 0.1 * AU);
renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
controls = new THREE.OrbitControls(camera, renderer.domElement);
然后我让用户可以选择在对象之间跳转,所以这就是我在用户选择 planet/moon 后设置相机的方式:
function cameraGoTo() {
for (var i = scene.children.length - 1; i >= 0 ; i--) {
var obj = scene.children[i];
if (obj.name == parameters.selected) {
controls.target = obj.position;
camera.position.copy(obj.position);
camera.position.y += obj.radius * 2;
}
}
}
问题是对于小的planets/moons(半径 <= 1000 公里)相机在围绕物体旋转时晃动。我只有计算机图形学的基础知识,所以我不知道这是 Orbit Controls 的问题还是它与渲染器本身有关......所以我尝试设置 logarithmicDepthBuffer = true
但它没有帮助。同样尝试不同的 scale
并没有改变任何东西。
提前感谢任何help/clues。
编辑:
这是 fiddle: http://jsfiddle.net/twxyz/8kxcdkjj/
您可以看到晃动随着以下任何一项而增加:
- 物体越小,
- 物体离原点越远,
这是什么原因?很明显它似乎与相机 near/far 光谱值无关,但与物体距场景中心的距离有关。
我想出了解决办法。
我的问题是处理对象远离原点时的浮点精度错误。事实证明这是一个众所周知的问题,并且有多种解决方案。我用过这个:
http://answers.unity3d.com/questions/54739/any-solution-for-extreamly-large-gameworlds-single.html
发生的事情基本上不是移动 camera/player,而是相对于始终位于原点的 camera/player 变换 整个场景 。在这种情况下,Orbit Controls 的目标始终是原点。