0
我掙扎着一個Object3D,它的子網格應該看着相機的位置。
如果相機距離「遠」,它可以正常工作,但如果相機朝向物體移動,則無法正常工作。Three.js Object3d兒童lookAt相機的位置
如果相機位置接近物體位置,則第二個添加的平面會旋轉,直到相機看到平面的邊緣。
而且我知道爲什麼這種行爲只出現在第二個添加的平面上,並且恰好相機接近物體位置。
這是我到目前爲止。
創建對象:
var obj = new THREE.Object3D();
obj.position.set(x, y, z);
var Uniforms = {
texturePrimary: { type: "t", value: Texture },
textureColorGraph: { type: "t", value: ColorGraph },
time: { type: "f", value: 0 },
color: { type: "f", value: 0 }
};
obj.Uniforms = Uniforms;
obj.add(makeplane1(3.2, Uniforms));
obj.add(makeplane2(25, Uniforms));
obj.update = function(pos){
this.Uniforms.time.value = shaderTiming;
$.each(this.children, function(i,mesh){
if(mesh.name === "plane1" || mesh.name === "plane2"){
var vec = mesh.parent.worldToLocal(pos);
mesh.lookAt(vec);
}
});
};
function makePlane1(radius, uniforms){
var Geo = new THREE.PlaneGeometry(radius, radius);
var Material = new THREE.ShaderMaterial(
{
uniforms: uniforms,
vertexShader: shaders[1].vertex,
fragmentShader: shaders[1].fragment,
blending: THREE.AdditiveBlending,
transparent: true
};
var plane = new THREE.Mesh(Geo, Material);
plane.name = "plane1";
return plane;
);
function makePlane2(radius, uniforms){
var Geo = new THREE.PlaneGeometry(radius, radius);
var Material = new THREE.ShaderMaterial(
{
uniforms: uniforms,
vertexShader: shaders[2].vertex,
fragmentShader: shaders[2].fragment,
blending: THREE.AdditiveBlending,
transparent: true
};
);
var plane = new THREE.Mesh(Geo, Material);
plane.name = "plane2";
return plane;
}
我可以打電話給this.lookAt(pos)
在obj.update(pos)
旋轉整個對象,但其他網格不應該轉動這樣,所以這是可悲的選項。
和簡單的頂點着色器的兩個平面:
varying vec2 vUv;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
vUv = uv;
}
然後我在animationloop撥打:
$.each(scene.children, function(i, obj){
if(obj.update !== undefined) {
shaderTiming = (time - startTime)/ 1000;
obj.update(camera.getWorldPosition());
}
});
編輯:我只注意到這種行爲只是發生,如果對象的位置不是(0,0,0)
。如果是這樣,它就像它應該在任何相機位置一樣。
另外一個簡單的距離計算,相機對象無法正常工作。
vec1 = this.position;
vec2 = camera.position;
var dist = Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2) + Math.pow(vec1.z - vec2.z, 2));
感謝您的任何提示。
如果'.lookAt()'不支持翻譯父(S)在一般情況下,爲什麼像它應該的行爲首先添加飛機?但很高興知道,謝謝! –
您的問題對我來說太複雜了。 – WestLangley
@WestLangley「lookAt()不支持具有旋轉和/或翻譯父對象的對象。」什麼時候才能解決?有沒有計劃修復它? – trusktr