javascript - 使用 Three.js 中的轨道控制旋转相机时出现奇怪的晃动

标签 javascript camera 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);

然后我为用户提供在对象之间跳转的选项,这就是我在用户选择行星/月亮后设置相机的方式:

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;
        }
    }
}

问题是,对于小行星/卫星(半径 <= 1000 公里),相机在围绕物体旋转时会晃动。我只有计算机图形学的基本知识,所以我不知道这是 Orbit Controls 的问题还是与渲染器本身有关......所以我尝试设置 logarithmicDepthBuffer = true但这没有帮助。尝试不同的scale也没有改变任何东西。

提前感谢您提供任何帮助/线索。

编辑:

这是 fiddle : http://jsfiddle.net/twxyz/8kxcdkjj/

您可以看到震动因以下任一情况而增加:

  • 物体越小,
  • 物体距离原点越远,

这是什么原因造成的?显然它与相机近/远光谱值无关,但与物体距场景中心的距离有关。

最佳答案

我已经想出了解决办法。

我的问题是处理远离原点的对象时出现浮点精度错误。事实证明,这是一个众所周知的问题,并且有多种解决方案。我用过这个:

http://answers.unity3d.com/questions/54739/any-solution-for-extreamly-large-gameworlds-single.html

所发生的基本上不是移动相机/播放器,而是相对于始终位于原点的相机/播放器来变换整个场景。在这种情况下,Orbit Controls 的目标始终是原点。

关于javascript - 使用 Three.js 中的轨道控制旋转相机时出现奇怪的晃动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28012352/

相关文章:

javascript - 在框中重新定位图像

javascript - 三.JS,忽略 parent 的轮换

TypeScript 错误 : node_modules/@types/three/three-core. d.ts(767,24):错误 TS2304:找不到名称 'Iterable'

javascript - Three.js 着色器在单个自定义几何网格面上无法正确显示

c# - 游戏编程和事件处理程序

javascript - 如何在 html5/JS 中只预加载音频文件的一部分?

Javascript 在数组内用逗号分割字符串并删除重复项,同时忽略结果数组的大小写敏感性

javascript - 选择多个在 chrome 中不起作用

java - 相机方向改变

android - Nexus 10 camera.release 挂起 30 秒