[英]Three.js - billboard effect, maintain orientation after camera pans
我有一个始终设置为面向相机的平面几何体:
plane.lookAt(camera.position);
在更新循环中。 我正在使用OrbitControls
来控制相机。 旋转或缩放场景时,平面将继续按预期面向摄像机。
但是,在平移场景后,当飞机继续面向摄像机时,旋转摄像机似乎也会旋转平面,因此,例如,如果平面包含文本,文本可能会显示为旋转或甚至颠倒到观众。
怎么能迫使飞机与相机保持对齐?
jsFiddle的例子: http : //jsfiddle.net/Stemkoski/ptVLD/
最简单的解决方案是将其添加到动画循环中:
plane.quaternion.copy( camera.quaternion );
更新小提琴: http : //jsfiddle.net/ptVLD/15/
或者,您可以使用THREE.Sprite
编辑:更新为three.js r.67
不知何故,只是发布在StackOverflow似乎组织和澄清我的想法:)
一个更好的解决方案(更强大的广告牌)似乎是:
plane.rotation.setFromRotationMatrix( camera.matrix );
问题中的jsFiddle代码链接已相应更新; 然而,现在在平移后旋转相机时,相机/飞机有一些“颤抖”,所以我怀疑这个解决方案仍然不理想,我很乐意欣赏并接受一个改进这个问题的答案。
“颤抖”是由于您没有将相机位置用于此新帧而引起的。 您可以根据之前的摄像机位置更新plane
,然后根据控件更新摄像机。
function animate() {
// plane.lookAt( camera.position ); // rotation messed up after camera pan
plane.rotation.setFromRotationMatrix( camera.matrix );
controls.update();
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
如果你交换这两个操作,你根本就没有“颤抖”
function animate() {
controls.update();
// plane.lookAt( camera.position ); // rotation messed up after camera pan
plane.rotation.setFromRotationMatrix( camera.matrix );
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.