gpt4 book ai didi

以相机为原点的 Three.js 光线转换

转载 作者:行者123 更新时间:2023-12-02 09:36:50 27 4
gpt4 key购买 nike

我正在尝试确定空间中的某个点是对相机可见还是隐藏在场景中的其他对象后面。为此,我将一条光线从相机的位置转换到空间中的那个点,并测试该光线是否与一组可交叉的对象相交。

我的问题是在相机位置本身与一组可交叉对象中的一个对象相交之前不会发生交叉。

我创建了一个 jsfiddle,如果检测到交叉点,将从相机位置到我正在测试可见性的空间位置绘制一条线。目前我认为,这条线只在相机位置与一组可交叉对象相交的特定点绘制。

如何让交叉点按应有的方式注册,而不必让相机位置与可交叉对象集中的对象相交?

代码:

    var container;
var camera, controls, scene, renderer;

init();
animate();

function init() {

camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 1000;

controls = new THREE.OrbitControls(camera);

controls.rotateSpeed = 1.0;
controls.zoomSpeed = 1.2;
controls.panSpeed = 0.8;

controls.noZoom = false;
controls.noPan = false;

controls.staticMoving = true;
controls.dynamicDampingFactor = 0.3;

controls.keys = [65, 83, 68];

controls.addEventListener('change', render);

// world

scene = new THREE.Scene();

var testObject_G = new THREE.CubeGeometry(100, 100, 5);
var testObject_M = new THREE.MeshBasicMaterial({
color: 0xBBBBBB
});
var testObject_Mesh = new THREE.Mesh(testObject_G, testObject_M);
testObject_Mesh.position.x = -150;
scene.add(testObject_Mesh);
var testObject_Mesh2 = new THREE.Mesh(testObject_G, testObject_M);
testObject_Mesh2.position.x = 0;
scene.add(testObject_Mesh2);
var testObject_Mesh3 = new THREE.Mesh(testObject_G, testObject_M);
testObject_Mesh3.position.x = 150;
scene.add(testObject_Mesh3);


scene2 = new THREE.Object3D();

// renderer

renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0xffffff, 1);
container = document.getElementById('container');
container.appendChild(renderer.domElement);



//

window.addEventListener('resize', onWindowResize, false);

}

function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();

renderer.setSize(window.innerWidth, window.innerHeight);

controls.handleResize();

render();

}

function animate() {

requestAnimationFrame(animate);
controls.update();

}

function render() {

renderer.render(scene, camera);
castRays();

}

function castRays() {

// rays

var direction = new THREE.Vector3(0, 200, -200);

var startPoint = camera.position.clone();

var ray = new THREE.Raycaster(startPoint, direction);

scene.updateMatrixWorld(); // required, since you haven't rendered yet

var rayIntersects = ray.intersectObjects(scene.children, true);

if (rayIntersects[0]) {
console.log(rayIntersects[0]);

var material = new THREE.LineBasicMaterial({
color: 0x0000ff
});
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(ray.ray.origin.x, ray.ray.origin.y, ray.ray.origin.z));
geometry.vertices.push(new THREE.Vector3(ray.ray.direction.x, ray.ray.direction.y, ray.ray.direction.z));
var line = new THREE.Line(geometry, material);
scene2.add( line );

}

scene.add(scene2);

}

谢谢

最佳答案

对于当前看到此线程的任何人,THREE.Projector 已被替换。

Three.js THREE.Projector has been moved to

下面的代码处理一个 3D 矢量。如果您转到上面的链接,第一位评论者提供了二维矢量的代码。

var vector = new THREE.Vector3();
var raycaster = new THREE.Raycaster();
var dir = new THREE.Vector3();

...

if ( camera instanceof THREE.OrthographicCamera ) {

vector.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, - 1 ); // z = - 1 important!

vector.unproject( camera );

dir.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );

raycaster.set( vector, dir );

} else if ( camera instanceof THREE.PerspectiveCamera ) {

vector.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 ); // z = 0.5 important!

vector.unproject( camera );

raycaster.set( camera.position, vector.sub( camera.position ).normalize());

}

var intersects = raycaster.intersectObjects( objects, recursiveFlag );`

关于以相机为原点的 Three.js 光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024044/

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