我试图使星际争霸像three.js所游戏..三JS /在其Y轴网格面临方向的动画旋转
我有问题,它的Y轴旋转物体面对新的方向,然后改变立场。
并通过旋转我的意思是动画/所以请别再用蹩脚的lookAt()函数
,如果有人告诉我如何吐温一些魔术obj.MatrixRotationY(角度),我将不胜感激,我希望从的Vector3
计算,角度这是我到目前为止有:
http://f.cl.ly/items/3J3R0X2q2R1h1J203C1V/drone.jpg
我从Vector3中获取了新的位置,如下所示。
// scene
var container;
var camera, scene, renderer;
// intersect with objects in this array
var intersectObjects = [];
// materials
var material = new THREE.MeshNormalMaterial();
var cristal_texture = new THREE.MeshLambertMaterial({ map: THREE.ImageUtils.loadTexture("models/JSON/textures/cristal.jpg") });
var destination;
init();
animate();
function init() {
container = document.createElement('div');
document.body.appendChild(container);
camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 15000);
camera.rotation.x = - 90 * (Math.PI/180);
camera.position.set(800 , 1000 , 0);
scene = new THREE.Scene();
plane = new THREE.Mesh(new THREE.PlaneGeometry(3000, 3000), new THREE.MeshBasicMaterial({ color: 0xe0e0e0 }));
plane.rotation.x = - 90 * (Math.PI/180);
plane.position.set(0,0,0);
plane.overdraw = true;
scene.add(plane);
intersectObjects.push(plane);
loader = new THREE.JSONLoader();
loader.load("models/JSON/driller.js", function(geometry) {
driller = new THREE.Mesh(geometry, material);
driller.position.set(0,50,0);
matr = new THREE.Matrix4();
driller.matrixAutoUpdate = false;
driller.geometry.applyMatrix(matr.makeRotationY(0));
driller.scale.set(0.5,0.5,0.5);
scene.add(driller);
});
loade = new THREE.JSONLoader();
loade.load("models/JSON/cristal.js", function(geometry) {
cristal = new THREE.Mesh(geometry, cristal_texture);
cristal.position.set(-1450,0,1450);
matre = new THREE.Matrix4();
cristal.matrixAutoUpdate = false;
cristal.geometry.applyMatrix(matre.makeRotationY(0));
cristal.scale.set(0.5,0.5,0.5);
scene.add(cristal);
intersectObjects.push(plane);
});
// lightning properties
var ambientLight = new THREE.AmbientLight(0xFFFFFF);
scene.add(ambientLight);
scene.matrixAutoUpdate = false;
// render engine
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.sortObjects = false;
container.appendChild(renderer.domElement);
// event listeners
document.addEventListener('mouseup', onMouseUp, false);
}
function onMouseUp(event) {
event.preventDefault();
x_pos = (event.clientX/window.innerWidth) * 2 - 1;
y_pos = -(event.clientY/window.innerHeight) * 2 + 1;
z_pos = 0.5;
var vector = new THREE.Vector3(x_pos , y_pos , z_pos);
var projector = new THREE.Projector();
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(intersectObjects);
if (intersects.length > 0) {
xp = intersects[0].point.x.toFixed(2);
yp = intersects[0].point.y.toFixed(2);
zp = intersects[0].point.z.toFixed(2);
destination = new THREE.Vector3(xp , 50 , zp);
var se23k = Math.random() * 4 * 4 ;
new TWEEN.Tween(driller.rotation).to({ y: se23k }, 1000).easing(TWEEN.Easing.Linear.None).start();
}
else {
console.log('outside boundaries');
}
};
function update(){
camera.lookAt(plane.position);
renderer.render(scene, camera);
}
function animate() {
requestAnimationFrame(animate);
update();
render();
}
function render() {
driller.updateMatrix();
cristal.updateMatrix();
TWEEN.update();
renderer.render(scene, camera);
}
如果通过旋转你的意思是动画,为什么不直接说,摆在首位?你是什么意思“所以请停下来一个糟糕的lookAt()函数”?看起来你需要结合使用补间lookAt()来获得你想要的效果。你是否试图在不使用lookAt()函数的情况下编写代码? –
稍后会尝试并提供更大的答案,但它会涉及从欧拉角度创建两个Quaterions,以及它们之间的距离。 http://threejs.org/docs/58/#Reference/Math/Quaternion #slerp –
此外,如果您删除关于lookAt的行,您将获得更少的downvotes - lookAt对于多种情况非常重要和有用的函数。虽然它不适合你的问题,但它肯定不是“蹩脚的”。 –