【问题标题】:Raycasting vertices of a mesh with three.js使用 three.js 投射网格的顶点
【发布时间】:2018-02-03 16:06:36
【问题描述】:

使用threejs,我可以对我创建的一些网格进行光线投射

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 500 );


var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

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

//创建三角形几何体

var material = new THREE.MeshBasicMaterial( { color : 0x00cc00 } );

var geometry = new THREE.Geometry();
geometry.vertices.push( new THREE.Vector3( -0.5, -0.5, 0 ) );
geometry.vertices.push( new THREE.Vector3(  0.5, -0.5, 0 ) );
geometry.vertices.push( new THREE.Vector3(  0.5,  0.5, 0 ) );

//create a new face using vertices 0, 1, 2
var face = new THREE.Face3( 0, 1, 2 );

//add the face to the geometry's faces array
geometry.faces.push( face );

var object1 = new THREE.Mesh( geometry, material );
scene.add( object1 );

camera.position.z = 10;

//获取鼠标位置

function onDocumentMouseMove( event ) {

    event.preventDefault();
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}

//渲染函数

function animate() {

    raycaster.setFromCamera( mouse, camera );
    var intersects = raycaster.intersectObject( object1 );

    if ( intersects.length > 0 ) console.log( intersects );

    renderer.render( scene, camera );
}

//运行

window.addEventListener( 'mousemove', onDocumentMouseMove, false);
window.addEventListener( 'mousemove', animate, false);
animate(); 

这行代码对我来说效果很好。但我想对这个三角形的索引而不是所有网格进行光线投射。我该怎么办?

我试过 tihs 但它不起作用?为什么?

raycaster.insertObject( object1.geometry.vertices );

【问题讨论】:

  • 您可以创建THREE.Points 并对它们进行射线投射。设置积分的方法见this three.js example
  • 嗨@WestLangley 我这样做了,但是当我的鼠标在点附近时会发生交互。我的意思是它不会等待我的鼠标悬停在它们上面。可能是什么问题?
  • 可能是this
  • 如果您不能制作API,请不要制作。哎呀

标签: three.js


【解决方案1】:

Raycaster.intersectObjects documentation

intersects 应该提供相交的face,以及相交的point。您可以根据最小阈值(或仅是与point 最接近的顶点)检查从点到面顶点的距离,如果通过则返回顶点。

var iFace = intersects[0].face;
var iPoint = intersects[0].point;
var ab = iFace.a.distanceTo(iFace.b);
var ac = iFace.a.distanceTo(iFace.c);
var bc = iFace.b.distanceTo(iFace.c);
var lambda = Math.min(ab, ac, bc) - 0.1;
if(iFace.a.distanceTo(iPoint) <= lambda){
    return iFace.a;
}
if(iFace.b.distanceTo(iPoint) <= lambda){
    return iFace.b;
}
if(iFace.c.distanceTo(iPoint) <= lambda){
    return iFace.c;
}

【讨论】:

  • 我正在搜索更基本的东西,比如 -- raycaster.insetObject(object1.geometry.vertices) --
  • @GaiKuroda 顶点是空间中的一个点。基于用户输入的射线恰好与该点相交的机会非常低。 THREE.Points 支持光线投射,但它使用边界球体进行交叉检测。您可以对顶点执行类似的操作,但您需要检查每个顶点,或使用初始光线投射中的 face 信息来细化要检查的顶点。
  • 确实,点数存在很大问题。我认为顶点上的小圆几何,但事实证明我无法为圆设置中心点,它始终必须自动为 0,0,0。用三个.js 完成
  • @GaiKuroda 没有“积分的大问题”。这就是他们的工作方式。如果您希望顶点可进行光线投射,则需要扩展 Vector3 类以包含类似于 THREE.Points.raycastraycast 方法,并添加 THREE.Raycaster.intersectVector3s 函数以接受顶点列表。
猜你喜欢
  • 1970-01-01
  • 2014-06-29
  • 2017-03-29
  • 1970-01-01
  • 2020-03-07
  • 2016-06-19
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多