试图在旋转时将粒子对准相机并在三个js中相交时发出警告信息?

时间:2012-12-10 13:51:23

标签: javascript three.js html5-canvas webgl

我正在尝试在粒子上创建事件处理程序,在球体上显示警报消息,始终瞄准相机。 与this demo类似的东西(并使其适用于IE 9+)

这是我的代码.. http://jsfiddle.net/praveenv29/cVnKV/11/

var renderer, projector;
var mouseX, mouseY, stats, container;
var objects = [];
var INTERSECTED;

var camera, scene, renderer, material, mesh, cont;

var w1 = 960;
var h1 = 700;

var halfWidth = w1 / 2;
var halfHeigth = h1 / 2;

function init() {
    cont = document.createElement('div');
    cont.id = "cont";
    document.body.appendChild(cont);

    camera = new THREE.PerspectiveCamera(75, w1 / h1, 1, 10000);
    camera.position.set(90, 90, -200);


    scene = new THREE.Scene();
    scene.add(camera);

    controls = new THREE.OrbitControls(camera);

    controls = new THREE.TrackballControls(camera, cont);
    controls.rotateSpeed = 0.8;
    controls.zoomSpeed = 1.2;
    controls.panSpeed = 2.5;
    controls.noZoom = true;
    controls.noPan = true;
    controls.staticMoving = false;

    controls.target.set(0, 0, 0);
    controls.keys = [95, 90, 84];

    renderer = new THREE.CanvasRenderer();


    material = new THREE.MeshBasicMaterial({
        color: 0x000000,
        wireframe: true
    });
    renderer.setSize(w1, h1);
    cont.appendChild(renderer.domElement);
    generateGeometry();

    var light = new THREE.PointLight(0xffffff);
    light.position.set(10, 0, 0);
    scene.add(light);

}

function animate() {
    requestAnimationFrame(animate);
    render();
}

function render() {
    controls.update();
    renderer.render(scene, camera);
}

function generateGeometry() {

    var axis = new THREE.AxisHelper();
    scene.add(axis);

    for (var i = 0; i < 20; i++) {

        var gloom = new THREE.ImageUtils.loadTexture('map_pin.png');
        materialr = new THREE.MeshBasicMaterial({
            map: gloom,
            overdraw: true,
            side: THREE.DoubleSide
        });
        var geometry = new THREE.PlaneGeometry(15, 15, 2, 2);

        var cube = new THREE.Mesh(geometry, materialr);
        cube.position.x = Math.random() * 2 - 1;
        cube.position.y = Math.random() * 2 - 1;
        cube.position.z = Math.random() * 2 - 1;
        cube.position.normalize();
        cube.position.multiplyScalar(125);

        cube.rotation.x = cube.position.x / Math.PI; //57.38

        cube.rotation.y = 360 / Math.PI * 2;

        objects.push(cube);
        scene.add(cube);

    }

    //earth
    var texture = THREE.ImageUtils.loadTexture('world.jpg');
    var materials = new THREE.MeshBasicMaterial({
        map: texture,
        overdraw: true
    });

    var cone = new THREE.SphereGeometry(120, 35, 35);

    var coneMesh = new THREE.Mesh(cone, material);

    coneMesh.position.y = 0;
    coneMesh.rotation.set(0, 0, 0);

    scene.add(coneMesh);


}

init();
animate();

1 个答案:

答案 0 :(得分:0)

目前还不清楚你在寻找什么;你的演示链接似乎无关...

您是否尝试使立方体显示相机正常(始终面向相机)?如果是这样,你需要逻辑重新定位它们以便在用户移动摄像机视图时重新面对摄像机,因为我看到你也在设置TrackballControls,它实际上移动了摄像机,而不是场景。这意味着用户可以更改场景的摄像机视图,并且需要重新定向需要面向摄像机的项目。需要将重定向逻辑放在render()函数中。

顺便说一下,让对象始终面对镜头:

  • 定义它,以便在不旋转时,它面向您的方向 想;
  • 通过您想要的任何方法将对象放入场景中, 包括您想要使用的任何分层旋转或翻译,以使它们定位在您想要的位置; (注意,他们可能不会面对 你想要的地方,但这一步没关系);
  • 从three.js请求它计算本地到世界的空间 场景的变换。在那之后,每个对象的世界 转换矩阵包含连接的旋转,和 将每个对象从本地空间转换为世界的翻译 空间。
  • 进入每个对象的local-to-world变换矩阵和 用身份替换旋转3x3矩阵组件 变换{[1 0 0] [0 1 0] [0 0 1]}。这有效地擦拭 在世界空间中旋转,制作你所做的所有物体 永远面对镜头。