three.js - THREE.BoxBufferGeometry 与 raycaster.intersectObjects 相交
问题描述
我想得到光线与盒子的交点。我的代码有什么问题?
const ggeo = new THREE.BoxBufferGeometry(100, 200, 60);
const gmesh = new THREE.Mesh(ggeo, new THREE.MeshBasicMaterial({ color: 0x00ffff}));
gmesh.position.set(-150, 0, -30);
gmesh.visible = true;
gmesh.updateMatrixWorld();
scene.add(gmesh);
// intersection
var from = new THREE.Vector3(-10, 0, -10);
var to = new THREE.Vector3(-1, 0, 0);
var raycaster = new THREE.Raycaster();
raycaster.set(from, to);
var intersects = raycaster.intersectObjects(gmesh as any, true);
if (intersects.length > 0) {
// no interseection !
}
这是一个小提琴:
解决方案
你的小提琴有两个问题:
- 您没有在光线投射之前更新网格的世界矩阵。
- 的第二个参数
Raycaster.set()
需要一个必须具有单位长度的方向向量。 - 你必须使用
intersectObject()
notintersectObjects()
。
这是一个工作示例:
var camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 1000;
var scene = new THREE.Scene();
scene.background = new THREE.Color(0xf0f0f0);
var raycaster = new THREE.Raycaster();
renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const ggeo = new THREE.BoxBufferGeometry(50, 300, 260);
const gmesh = new THREE.Mesh(ggeo, new THREE.MeshBasicMaterial({
color: 0x00ffff
}));
gmesh.position.set(-150, 0, -10);
gmesh.updateMatrixWorld();
scene.add(gmesh);
var from = new THREE.Vector3(0, 0, -20);
var wallvec = new THREE.Vector3(-1, 0, 0);
var raycaster = new THREE.Raycaster();
raycaster.set(from, wallvec);
//
const lineGeometry = new THREE.BufferGeometry().setFromPoints( [from, new THREE.Vector3(-10000, 0 -20)] );
const line = new THREE.Line(lineGeometry, new THREE.LineBasicMaterial( {color: 0xff0000}));
scene.add(line);
//
var intersects = raycaster.intersectObject(gmesh);
if (intersects.length > 0) {
console.log('INTERSECTED');
}
renderer.render(scene, camera);
body {
margin: 0;
}
<script src="https://cdn.jsdelivr.net/npm/three@0.134.0/build/three.min.js"></script>
它还可视化光线,因此可以看到光线实际击中网格的位置。
顺便说一句:您帖子中的代码片段和小提琴中的代码在某些方面有所不同。调查最好使两者保持同步。
推荐阅读
- javascript - TypeError:无法在 IE 10 上获取未定义或空引用的属性“ngMetadataName”
- android - 无法动态创建按钮
- fullcalendar - FullCalendar - 在 dayClick 上获取背景事件
- assembly - 如何使用我的阶乘汇编代码设置初始值?
- ios - 在 FSCalendar 中添加自定义假期
- python - 在不同目录中执行同名的python脚本
- verilog - 在verilog 2005中将矩阵转换为数组
- powerbi - 按条件过滤的 Power BI (DAX) 不同计数(Where 子句)
- c# - 在 Windows 服务中调用 Web API?
- shell - influxdb cli如何使用字符串文字