如何在THREE.JS中将物体放在相机前?

clo*_*131 6 camera three.js

我试图把一个物体放在相机前面,但是还没有.

我正在使用FlyControls移动相机,现在我想在它前面放一个物体.我怎样才能做到这一点?我尝试了很多不同的方法,但我没有成功.

谢谢

Tim*_*Tim 16

您是否尝试过将物体作为相机的一个孩子,然后将其向前翻译?

camera.add(nanobot);
nanobot.position.set(0,0,-100);
Run Code Online (Sandbox Code Playgroud)

上面将纳米机器人永久地放置在相机前面的100个单位......这就是它将保留到你的位置:

camera.remove(nanobot);
Run Code Online (Sandbox Code Playgroud)

...在此之前它应该保持在全球空间中的位置,直到您使用其他方法移动它.

  • 你还必须让相机成为场景的孩子(通常不是默认的)`scene.add(camera)` (6认同)
  • 确保`nanobot.position.set(0,0,-100);`位于`camera.add(nanobot);`之后**:`position`是相对于相机的本地位置。[三人r89] (2认同)
  • 这个答案对我有用,只需将其添加到我正在开发的一个非常复杂的 webxr 项目中,在最新的 Three.js (0.120.1) 上运行。这是在 webxr 场景中,因此相机移动很多并且场景坐标不稳定,但精灵仍保持在应有的位置。 (2认同)

小智 5

我正在使用 Three.js r88 并从 Kaspar Lee 发布的内容开始制定了一个解决方案。

function updatePositionForCamera(camera) {
    // fixed distance from camera to the object
    var dist = 100;
    var cwd = new THREE.Vector3();
    
    camera.getWorldDirection(cwd);
    
    cwd.multiplyScalar(dist);
    cwd.add(camera.position);
    
    myObject3D.position.set(cwd.x, cwd.y, cwd.z);
    myObject3D.setRotationFromQuaternion(camera.quaternion);
}
Run Code Online (Sandbox Code Playgroud)


clo*_*131 2

var cx, cy, cz, lx, ly, lz;



dir.set(0,0,-1);
dir.applyAxisAngle(0,camera.rotation.x);
dir.applyAxisAngle(1,camera.rotation.y);
dir.applyAxisAngle(2,camera.rotation.z);
var dist = 100;

cx = camera.position.x;
cy = camera.position.y;
cz = camera.position.z;

lx = dir.x;
ly = dir.y;
lz = dir.z;


var l;

l = Math.sqrt((dist*dist)/(lx*lx+ly*ly+lz*lz));

var x1, x2;
var y1, y2;
var z1, z2;     

x1 = cx + lx*l;
x2 = cx - lx*l;

y1 = cy + ly*l;
y2 = cy - ly*l;

z1 = cz + lz*l;
z2 = cz - lz*l;


nanobot.position.set(x1, y1, z1 );
Run Code Online (Sandbox Code Playgroud)

我尝试计算相机方向的方向向量,然后计算穿过腔室的线,在这条线上距相机一定距离处放一个点