Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript threejs-几何坐标系到屏幕坐标系_Javascript_Three.js - Fatal编程技术网

Javascript threejs-几何坐标系到屏幕坐标系

Javascript threejs-几何坐标系到屏幕坐标系,javascript,three.js,Javascript,Three.js,该平面的宽度为800px: geometry = new THREE.PlaneGeometry( 800, 20, 0, 0 ); material = new THREE.MeshBasicMaterial({ color:0xFFFFFF, side:THREE.DoubleSide }); mesh = new THREE.Mesh(geometry, material); mesh.updateMatrixWorld(); scene.add(mesh); 当

该平面的宽度为800px:

geometry = new THREE.PlaneGeometry( 800, 20, 0, 0 );

material = new THREE.MeshBasicMaterial({ 
    color:0xFFFFFF,
    side:THREE.DoubleSide 
});

mesh = new THREE.Mesh(geometry, material);
mesh.updateMatrixWorld();
scene.add(mesh);
当我试图操纵它时,会使坐标系变成垃圾

mesh.geometry.vertices[0].setY(0);
mesh.geometry.vertices[0].setX(0);
mesh.geometry.vertices[0].setZ(0);

mesh.geometry.vertices[1].setY(0);
mesh.geometry.vertices[1].setX(800);
mesh.geometry.vertices[1].setZ(0);

mesh.geometry.vertices[2].setY(20);
mesh.geometry.vertices[2].setX(0);
mesh.geometry.vertices[2].setZ(0);

mesh.geometry.vertices[3].setY(20);
mesh.geometry.vertices[3].setX(800);
mesh.geometry.vertices[3].setZ(0);

mesh.geometry.verticesNeedUpdate = true;
我可以将几何体对象的坐标系调整为相机帧的坐标系


0px=0

如果这不是您想要的,我很抱歉。如果您的意思是需要将3d世界中的矢量3位置转换为屏幕上的2d像素位置,则以下是一个典型转换:

    getScreenTranslation = function (obj, renderer, camera) {
        var vector = new THREE.Vector3();
        var widthHalf = 0.5 * renderer.context.canvas.width;
        var heightHalf = 0.5 * renderer.context.canvas.height;

        vector.setFromMatrixPosition(obj.matrixWorld);
        vector.project(camera);
        vector.x = vector.x * widthHalf + widthHalf;
        vector.y = -(vector.y * heightHalf) + heightHalf;
        return {
                x: vector.x,
                y: vector.y
        };
   };

请记住,您可能需要补偿画布元素在网页中的位置

如果这不是你想要的,我道歉。如果您的意思是需要将3d世界中的矢量3位置转换为屏幕上的2d像素位置,则以下是一个典型转换:

    getScreenTranslation = function (obj, renderer, camera) {
        var vector = new THREE.Vector3();
        var widthHalf = 0.5 * renderer.context.canvas.width;
        var heightHalf = 0.5 * renderer.context.canvas.height;

        vector.setFromMatrixPosition(obj.matrixWorld);
        vector.project(camera);
        vector.x = vector.x * widthHalf + widthHalf;
        vector.y = -(vector.y * heightHalf) + heightHalf;
        return {
                x: vector.x,
                y: vector.y
        };
   };

请记住,您可能需要补偿画布元素在网页中的位置

你的问题不太清楚。我想把各个顶点放在屏幕坐标上。当你说
0px=0
时,你的意思是使场景中的每个坐标(我假设xy,因为屏幕没有z)与屏幕坐标L对齐,即矩形@(30,50,10)将(在屏幕上)@(30px,50px)对吗?你的问题可能重复的地方不是很清楚。我想把各个顶点放在屏幕坐标上。当你说
0px=0
时,你的意思是让场景中的每个坐标(我假设xy,因为屏幕上没有z)与屏幕的坐标对齐,例如,一个矩形@(30,50,10)将是(在屏幕上)@(30px,50px)正确-可能重复