我正在创建一个应用,其中一个人(现在我正在使用圆锥形)站立在某个表面上(现在我正在使用纵向放置的圆柱),我希望他们的脚定向朝向某个点(现在它是圆柱体的中心)。
(编辑:我刚刚意识到这张照片中的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()函数?谢谢〜
答案 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
圆锥体会抬起:)