我在ThreeJS中渲染了模型。現在,我需要添加一些交互功能,以便:ThreeJS如何添加交互性,
- 根據用戶輸入的值,我需要爲模型的某些部分着色。
- 如果我點擊任何模型零件,我希望它被突出顯示。
我是ThreeJS的新手,有點困惑。我該怎麼做呢?
我在ThreeJS中渲染了模型。現在,我需要添加一些交互功能,以便:ThreeJS如何添加交互性,
我是ThreeJS的新手,有點困惑。我該怎麼做呢?
在的init():
document.addEventListener('mousedown', onDocumentMouseDown, false);
和:
function onDocumentMouseDown(event) {
event.preventDefault();
var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, - (event.clientY/window.innerHeight) * 2 + 1, 0.5);
projector.unprojectVector(vector, camera);
var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize());
var intersects = ray.intersectObjects(objects);
if (intersects.length > 0) {
intersects[ 0 ].object.material.color.setHex(Math.random() * 0xffffff);
var particle = new THREE.Particle(particleMaterial);
particle.position = intersects[ 0 ].point;
particle.scale.x = particle.scale.y = 8;
scene.add(particle);
}
/*
// Parse all the faces
for (var i in intersects) {
intersects[ i ].face.material[ 0 ].color.setHex(Math.random() * 0xffffff | 0x80000000);
}
*/
}
我建議從那裏開始。
更新
function onDocumentMouseDown(event) {
event.preventDefault();
var vector = new THREE.Vector3((event.clientX/window.innerWidth) * 2 - 1, - (event.clientY/window.innerHeight) * 2 + 1, 0.5);
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(objects);
if (intersects.length > 0) {
intersects[ 0 ].object.material.color.setHex(Math.random() * 0xffffff);
var particle = new THREE.Sprite(particleMaterial);
particle.position = intersects[ 0 ].point;
particle.scale.x = particle.scale.y = 16;
scene.add(particle);
}
}
此事件管理器可以幫助你。
import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three';
import { InteractionManager } from 'three.interaction';
const renderer = new WebGLRenderer({ canvas: canvasElement });
const scene = new Scene();
const camera = new PerspectiveCamera(60, width/height, 0.1, 100);
// new a manager, then you can add interaction-event with your free style
const interactionManager = new InteractionManager(renderer, scene, camera);
const cube = new Mesh(
new BoxGeometry(1, 1, 1),
new MeshBasicMaterial({ color: 0xffffff }),
);
cube.cursor = 'pointer';
cube.on('click', function(ev) {});
cube.on('touchstart', function(ev) {});
cube.on('touchcancel', function(ev) {});
cube.on('touchmove', function(ev) {});
cube.on('touchend', function(ev) {});
cube.on('mousedown', function(ev) {});
cube.on('mouseout', function(ev) {});
cube.on('mouseover', function(ev) {});
cube.on('mousemove', function(ev) {});
cube.on('mouseup', function(ev) {});
// ...
scene.add(cube);
非常相似http://stackoverflow.com/questions/7984471/how-to-get-clicked-element-in-three-js – 2012-02-27 18:42:24