Three.js | 通过Blender光线投射导入的.obj模型

raphrb2

我已通过Blender使用加载了3D地形OBJLoader我还创建了一个网格物体(下图为黄色指针),当它在地形上时我想跟随它。我尝试使用raycaster方法,但我不知道确切地将其应用于.obj的方法,因为似乎无法在加载程序之外访问它。

当鼠标跟随鼠标时,如何使其指针(黄色网格)粘在地形上(加载的.obj)?

请帮助总共three.js新手...

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 );

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

camera.position.z = 150;
camera.position.y=300;
camera.position.x=350;

var light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );
scene.add( light );

var controls= new THREE.OrbitControls(camera,renderer.domElement);
controls.enableDamping=true;
controls.campingFactor=0.25;
controls.enableZoom=true;

controls.minDistance= 1;
controls.maxDistance=3000;

controls.minPolarAngle= -Math.PI/2;
controls.maxPolarAngle= Math.PI/2;

var terrain;
var mtlLoader = new THREE.MTLLoader();
mtlLoader.load('models/terrain.mtl',
    (materials) => {
        materials.preload();
    
        var loader = new THREE.OBJLoader();
        loader.setMaterials(materials);
        loader.load(
                'models/terrain.obj',
        function ( object ) {
        terrain = object;
        scene.add( terrain );
        });
    }
); 


var Cylindergeometry = new THREE.CylinderGeometry( 5, 0, 8, 32 );
var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
var cylinder = new THREE.Mesh( Cylindergeometry, material );
  
var Torusgeometry = new THREE.TorusGeometry( 7, 0.5, 8, 6);
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var torus = new THREE.Mesh( Torusgeometry, material);
Torusgeometry.rotateX(1.5708);
Torusgeometry.translate(0,-4.5,0);
  //Merge the two parts to make it one mesh (yellow pivot)
var PivotGeometry = new THREE.Geometry();
PivotGeometry.merge(Cylindergeometry);
PivotGeometry.merge(Torusgeometry);
var pivot = new THREE.Mesh(PivotGeometry, material);
scene.add(pivot);  



// Trying to Raycast the terrain to make the pivot follow the mouse while it's on it 
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();

function onMouseMove( event ) {

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

    // See if the ray from the camera into the world hits one of our meshes
    var intersects = raycaster.intersectObject( terrain,true );

    // Toggle rotation bool for meshes that we clicked
    if ( intersects.length > 0 ) {
        
        pivot.position.set( 0, 0, 0 );
        pivot.lookAt( intersects[ 0 ].face.normal );

        pivot.position.copy( intersects[ 0 ].point );

    }

}

//Met à jour l'affichage de la scène
var animate = function () {
    requestAnimationFrame( animate );

    renderer.render( scene, camera );
}; 

animate(); 

我加载的.obj地形

木根87

您的代码中包含以下行:

var intersects = raycaster.intersectObjects( object );

我看不到在哪里object声明了变量。我建议您在模块作用域中声明此变量,将已加载的OBJ文件分配给它,然后改用以下代码:

var intersects = raycaster.intersectObject( object, true );

OBJLoader.load()返回一个类型的对象,THREE.Group在某种意义上,该对象是一个容纳任意数量的网格的容器。因此,您要递归进行射线广播。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Three.js光线投射THREE.Object3D

在three.js中更改obj模型材料

Three.js从缓存加载obj模型

如何通过three.dart加载obj模型?

在three.js中对“子场景”进行光线投射

如何投射可见光线Three.js

在three.js中提高光线投射精度

Three.JS-自定义网格上的光线投射

Three.js导入的模型抗锯齿

无法导入three.js glTF模型

尝试将Blender JSON模型导入three.js,出现“长度”错误

Three.js导入的obj不正确的阴影渲染

显示从Blender到three.js的导出模型倒置

如何在没有Three.js的情况下呈现OBJ模型-WebGL

如何在Three.js中加载.obj 3D模型?

如何在 Three.js 中加载各种 obj 3D 模型?

在three.js中以线框模式显示已加载的OBJ模型

Three.js导入Blender模型:未被捕获的TypeError:无法读取未定义的属性“ length”

在three.js中使用OBJMTLoader导入WebGL模型失败

使用three.js导入3d模型

将JSON模型导入Three.js-没有显示

从子摄像机到场景的THREE.js光线投射

Three.js:使用点,InstancedBufferGeometry和RawShaderMaterial进行光线投射(GPU选取)

在Three.js PointCloud中进行涉及单个点的光线投射

具有光线投射和相交测试的Three.js鼠标事件

无法在Three.js中的组中光线投射单个对象以运行动画

Three.js:使用场景对象子集进行光线投射

在Three.js中使用正交摄影机进行不精确的光线投射

three.js-如何在不带* .mtl文件的情况下为* .obj模型设置自定义颜色?