【问题标题】:Ray.direction where camera (object) is looking atRay.direction 相机(物体)正在看的地方
【发布时间】:2012-10-21 22:34:57
【问题描述】:

我正在做简单的碰撞检测,虽然我可以使用 THREE.ray 轻松检测上/下物体,但当它们旋转时,我很难找到相机(或任何物体)前后的物体?我尝试用投影仪投射光线,并使用辅助箭头显示该光线是如何射出的。一旦我开始围绕 Y 轴旋转相机,光线会指向相反的方向,或者只是表现得很奇怪......

ray = new THREE.Ray();
projector = new THREE.Projector();
vector = projector.projectVector( coll.getObject().matrix.getPosition().clone(), camera );
ray.direction = vector.normalize();
ray.origin = coll.getObject().matrix.getPosition().clone();
helper.setDirection(ray.direction.clone());
helper.position = ray.origin.clone();

【问题讨论】:

  • 这有点好,但它仍然取决于我的相机是否在接近 (0, 0, 0) 的坐标,不知道发生了什么:var localVertex = coll.getObject().position.clone(); var globalVertex = coll.getObject().matrix.multiplyVector3(localVertex); var directionVector = globalVertex.subSelf( coll.getObject().position.clone()); ray = new THREE.Ray( coll.getObject().position.clone(), directionVector.clone().normalize() ); //ray.origin.addSelf(ax.clone().multiplyScalar(rad / 2)); helper.setDirection(ray.direction.clone()); helper.position = ray.origin.clone();

标签: vector camera three.js collision direction


【解决方案1】:

我最终在连接到相机的对象周围设置了一个立方体,并通过添加的顶点拍摄光线,如下所示:

vertices = coll.getObject().geometry.vertices;
        rad = coll.getObject().boundRadius+1;
        var directions = {
            "up": [4,1],
            "down": [6,2],
            "front": [3,4],
            "back": [7,0],
            "left": [5,6],
            "right": [1,2],
        };
        var collisions = {
            "up": {},
            "down": {},
            "front": {},
            "back": {},
            "left": {},
            "right": {},
        };
        for (key in directions){
            (directions[key].length > 1) ? localVertex =  vertices[directions[key][0]].clone().addSelf(vertices[directions[key][1]].clone()) : localVertex = vertices[directions[key][0]].clone();  
            globalVertex = coll.getObject().matrix.multiplyVector3(localVertex);
            directionVector = globalVertex.subSelf( coll.getObject().position );
            ray = new THREE.Ray( coll.getObject().position.clone(), directionVector.clone().normalize(), 0, 1000 );
            intersects = ray.intersectObjects(obj, true);
            if (intersects.length > 0) {
                distance = intersects[ 0 ].distance;
                if (distance >= 0 && distance <= rad) {
                    collisions[key] = intersects[ 0 ];              
                } else {                        
                    collisions[key] = false;
                }
            } else {
                collisions[key] = false;
                ++falseCount;
            }       
        }                   
    }
    return (falseCount !== 6) ? collisions : false;

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2013-01-26
    相关资源
    最近更新 更多