gpt4 book ai didi

javascript - 在渲染器中捕获特定网格上的点击事件

转载 作者:数据小太阳 更新时间:2023-10-29 04:24:26 26 4
gpt4 key购买 nike

我设置了一个包含两个网格(立方体)的 Canvas 渲染器。我需要做的是捕捉每个立方体上的点击事件,为它调用方便的方法。

到目前为止,我可以在所有渲染器上捕获点击事件,这意味着当我点击 cube1 和 cube2 时,点击属于相同的,因为它绑定(bind)到 renderer :)

我的问题是,如何为每个立方体绑定(bind)点击事件?

我的相关代码如下:

            //dom
var containerPopUp=document.getElementById('popup');
//renderer
var rendererPopUp = new THREE.CanvasRenderer();
rendererPopUp.setSize(420,200);

containerPopUp.appendChild(rendererPopUp.domElement);
//Scene
var scenePopUp = new THREE.Scene();
//Camera
var cameraPopUp = new THREE.PerspectiveCamera(50,60/60,1,1000);

cameraPopUp.position.z = 220;
cameraPopUp.position.y = 20;
//
scenePopUp.add(cameraPopUp);

//Add texture for the cube
//Use image as texture
var img2D = new THREE.MeshBasicMaterial({ //CHANGED to MeshBasicMaterial
map:THREE.ImageUtils.loadTexture('img/2d.png')
});
img2D.map.needsUpdate = true; //ADDED
//Add Cube
var cubeFor2D = new THREE.Mesh(new THREE.CubeGeometry(40,80,40),img2D);
cubeFor2D.position.x =- 60;
cubeFor2D.position.y = 20;

scenePopUp.add(cubeFor2D);
//
var img3D = new THREE.MeshBasicMaterial({ //CHANGED to MeshBasicMaterial
map:THREE.ImageUtils.loadTexture('img/3d.png')
});
img3D.map.needsUpdate = true;
var cubeFor3D = new THREE.Mesh(new THREE.CubeGeometry(40,80,40),img3D);
cubeFor3D.position.x = 60;
cubeFor3D.position.y=20;

scenePopUp.add(cubeFor3D);
//
rendererPopUp.render(scenePopUp,cameraPopUp);
//
animate();

rendererPopUp.domElement.addEventListener('click',testCall,false);//Here the click event is bound on the whole renderer, means what ever object in the renderer is clicked, the testCall method is called.

如您所见,cubeFor2D 和 cubeFor3D 包含在渲染器中。我需要在每个网格上绑定(bind)点击事件。我用 threex.domevent.js 试过了:

var meshes  = {};
meshes['mesh1'] = cubeFor2D;
meshes['mesh1'].on('mouseover', function(event){

//response to click...
console.log('you have clicked on cube 2D');

});

但它不起作用,在控制台中,我得到了这个错误:

TypeError: meshes.mesh1.on is not a function

当然,我包含了API源代码文件:

    <script src="threex.domevent.js"></script>

最佳答案

您可以像这样生成回调。首先为每个对象定义回调函数:

mesh.callback = function() { console.log( this.name ); }

然后按照标准的挑选模式:

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();

function onDocumentMouseDown( event ) {

event.preventDefault();

mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;

raycaster.setFromCamera( mouse, camera );

var intersects = raycaster.intersectObjects( objects );

if ( intersects.length > 0 ) {

intersects[0].object.callback();

}

}

编辑:更新到 three.js r.70

关于javascript - 在渲染器中捕获特定网格上的点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12800150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com