three.js lookAt():如何将不是正Z轴的某个局部轴指向另一个对象

时间:2019-04-06 08:35:13

标签: javascript three.js

我正在创建一个应用,其中一个人(现在我正在使用圆锥形)站立在某个表面上(现在我正在使用纵向放置的圆柱),我希望他们的脚定向朝向某个点(现在它是圆柱体的中心)。

The intended result.编辑:我刚刚意识到这张照片中的Z轴指向了错误的方向;它应该朝着相机 指向,但问题仍然没有改变。)

这是与我要完成的代码类似的版本。 https://codepen.io/liamcorbett/pen/YMWayJ(使用箭头键移动圆锥)

//...

person = CreatePerson();
person.mesh.up = new THREE.Vector3(0, 0, 1);

//
// ...
// 

function updateObj(obj, aboutObj=false){
    let mesh = obj.mesh;
    if (aboutObj) {
        mesh.lookAt(
            aboutObj.mesh.position.x, 
            aboutObj.mesh.position.y, 
            mesh.position.z)
    };
}

//
// ...
//

function animate() {
    // ...

    updateObj(person);

    // ...
}

上面的代码为我提供了与我想要的东西类似的东西,但是问题是lookAt()似乎总是将局部正Z轴指向某个方向,而我d更希望它指向局部负Y轴

我宁愿不更改模型本身的x,y,z轴,因为当我将其他逻辑应用于person对象时,这会很麻烦。

是否可以更改lookAt()使用的轴?还是我必须滚动自己的lookAt()函数?谢谢〜

2 个答案:

答案 0 :(得分:1)

  

是否可以更改lookAt()使用的轴?

否,3D对象(不包括相机)的默认本地forward向量是(0, 0, 1)。与其他引擎不同,three.js不允许配置forward向量,只能配置up向量。但这对您的情况确实没有帮助。

您可以尝试变形几何以获得相似的效果,请参见:

https://codepen.io/anon/pen/gyMdMM

如果由于某些原因不想执行此操作,而仍然想使用Object3D.lookAt(),则必须计算一个不同的目标向量(而不是圆柱体的中心)。

答案 1 :(得分:0)

即使无法更改// ref. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data var oReq = new XMLHttpRequest(); oReq.open("GET", "demo.txt", true); oReq.responseType = "arraybuffer"; // handle response body as binary oReq.onload = function (oEvent) { if (oReq.response) { var sjisDecoder = new TextDecoder('shift-jis'); alert(sjisDecoder.decode(oReq.response)) // Note: not oReq.responseText } }; oReq.send(null); 方法的正向矢量(如@ Mugen87所说),您仍然可以通过事先知道所使用的正向Z轴之间的差来调整局部旋转。您认为网格物体是“向上”的轴(例如:一个人站在Y轴上)。

基本上,就您而言,只需在lookAt方法之后添加以下行:

lookAt

圆锥体会抬起:)