如何使用键盘输入移动三个 JS 立方体?
How do I move a Three JS cube with keyboard input?
下面的代码是我目前写的,用三个js尝试用WASD键上下左右移动或翻译一个旋转的立方体对象, 并使用 space 栏重置到原始位置(屏幕中间)。我对三个 js 很陌生,我不知道如何让运动工作。任何帮助将不胜感激。这是我目前所拥有的:
// first 5 lines are a template and should be pretty much the same always
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// end template here
var geom = new THREE.BoxGeometry(10, 10, 10);
var mat = new THREE.MeshBasicMaterial({color: "red"});
var cube = new THREE.Mesh(geom, mat);
scene.add(cube);
camera.position.x = 2;
camera.position.y = 1;
camera.position.z = 20;
var light = new THREE.AmbientLight( 0x404040 ); // soft white light
scene.add( light );
// White directional light at 70% intensity shining from the top.
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.7 );
scene.add( directionalLight );
// movement
document.addEventListener("keydown", onDocumentKeyDown, false);
function onDocumentKeyDown(event) {
var keyCode = event.which;
// up
if (keyCode == 87) {
cube.position.y += 1;
// down
} else if (keyCode == 83) {
cube.position.y -= 1;
// left
} else if (keyCode == 65) {
cube.position.x -= 1;
// right
} else if (keyCode == 68) {
cube.position.x += 1;
// space
} else if (keyCode == 32) {
cube.position.x = 0.0;
cube.position.y = 0.0;
}
render();
};
var render = function() {
requestAnimationFrame(render);
cube.rotation.x += 0.03;
cube.rotation.y += 0.02;
cube.rotation.z += 0.01;
renderer.render(scene, camera);
};
render();
这只是 Javascript 文件。我还有一个单独的 HTML 文件可以从中启动。这是 HTML:
<html><head><title>WebGL with three.js</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head><body>
<script src="three.js"></script>
<script src="Learn_Cube3.js"></script>
</body></html>
在您的按键事件中重新调用您的渲染方法:
function onDocumentKeyDown(event) {
...
render();
};
问题是您正在更新值,但 ThreeJS 不会在事情发生变化时自动重新渲染视图,您必须告诉它重新渲染。
编辑:在您的渲染方法中,您只是在修改旋转属性,因此立方体只会旋转。您还需要告诉 ThreeJS 立方体的新位置。
我认为 "xSpeed" 和 "ySpeed" 的解决方案行不通,您需要根据 position.x 和 position.y 值实际 add/subtract .
这个怎么样? -
// movement - please calibrate these values
var xSpeed = 0.0001;
var ySpeed = 0.0001;
document.addEventListener("keydown", onDocumentKeyDown, false);
function onDocumentKeyDown(event) {
var keyCode = event.which;
if (keyCode == 87) {
cube.position.y += ySpeed;
} else if (keyCode == 83) {
cube.position.y -= ySpeed;
} else if (keyCode == 65) {
cube.position.x -= xSpeed;
} else if (keyCode == 68) {
cube.position.x += xSpeed;
} else if (keyCode == 32) {
cube.position.set(0, 0, 0);
}
};
要移动对象,您必须更改对象的位置。另外,根据需要校准 xSpeed
和 ySpeed
。
下面的代码是我目前写的,用三个js尝试用WASD键上下左右移动或翻译一个旋转的立方体对象, 并使用 space 栏重置到原始位置(屏幕中间)。我对三个 js 很陌生,我不知道如何让运动工作。任何帮助将不胜感激。这是我目前所拥有的:
// first 5 lines are a template and should be pretty much the same always
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// end template here
var geom = new THREE.BoxGeometry(10, 10, 10);
var mat = new THREE.MeshBasicMaterial({color: "red"});
var cube = new THREE.Mesh(geom, mat);
scene.add(cube);
camera.position.x = 2;
camera.position.y = 1;
camera.position.z = 20;
var light = new THREE.AmbientLight( 0x404040 ); // soft white light
scene.add( light );
// White directional light at 70% intensity shining from the top.
var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.7 );
scene.add( directionalLight );
// movement
document.addEventListener("keydown", onDocumentKeyDown, false);
function onDocumentKeyDown(event) {
var keyCode = event.which;
// up
if (keyCode == 87) {
cube.position.y += 1;
// down
} else if (keyCode == 83) {
cube.position.y -= 1;
// left
} else if (keyCode == 65) {
cube.position.x -= 1;
// right
} else if (keyCode == 68) {
cube.position.x += 1;
// space
} else if (keyCode == 32) {
cube.position.x = 0.0;
cube.position.y = 0.0;
}
render();
};
var render = function() {
requestAnimationFrame(render);
cube.rotation.x += 0.03;
cube.rotation.y += 0.02;
cube.rotation.z += 0.01;
renderer.render(scene, camera);
};
render();
这只是 Javascript 文件。我还有一个单独的 HTML 文件可以从中启动。这是 HTML:
<html><head><title>WebGL with three.js</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head><body>
<script src="three.js"></script>
<script src="Learn_Cube3.js"></script>
</body></html>
在您的按键事件中重新调用您的渲染方法:
function onDocumentKeyDown(event) {
...
render();
};
问题是您正在更新值,但 ThreeJS 不会在事情发生变化时自动重新渲染视图,您必须告诉它重新渲染。
编辑:在您的渲染方法中,您只是在修改旋转属性,因此立方体只会旋转。您还需要告诉 ThreeJS 立方体的新位置。
我认为 "xSpeed" 和 "ySpeed" 的解决方案行不通,您需要根据 position.x 和 position.y 值实际 add/subtract .
这个怎么样? -
// movement - please calibrate these values
var xSpeed = 0.0001;
var ySpeed = 0.0001;
document.addEventListener("keydown", onDocumentKeyDown, false);
function onDocumentKeyDown(event) {
var keyCode = event.which;
if (keyCode == 87) {
cube.position.y += ySpeed;
} else if (keyCode == 83) {
cube.position.y -= ySpeed;
} else if (keyCode == 65) {
cube.position.x -= xSpeed;
} else if (keyCode == 68) {
cube.position.x += xSpeed;
} else if (keyCode == 32) {
cube.position.set(0, 0, 0);
}
};
要移动对象,您必须更改对象的位置。另外,根据需要校准 xSpeed
和 ySpeed
。