Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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/5/reporting-services/3.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 在Three.js projetion中计算顶部、左侧、宽度和高度_Javascript_Positioning_Three.js - Fatal编程技术网

Javascript 在Three.js projetion中计算顶部、左侧、宽度和高度

Javascript 在Three.js projetion中计算顶部、左侧、宽度和高度,javascript,positioning,three.js,Javascript,Positioning,Three.js,我正在努力解决一个问题:我需要在WebGL动画上放置一个DIV。我旋转一个网格,基于一个平面几何体占据一个矩形大小,然后我想在那里放置DIV,所以我需要知道平面的X,Y坐标和渲染尺寸是什么 我尝试了THREE.Projection类,但没有帮助,即使我使用.projectVector投影了[0]垂直体。它计算出: x: -0.1994540991160383 y: 0.17936202821347358 z: 0.9970982652556688 …这对我帮助不大。要将3D点投影到屏幕坐标,

我正在努力解决一个问题:我需要在WebGL动画上放置一个DIV。我旋转一个
网格
,基于一个
平面几何体
占据一个矩形大小,然后我想在那里放置DIV,所以我需要知道平面的X,Y坐标和渲染尺寸是什么

我尝试了
THREE.Projection
类,但没有帮助,即使我使用
.projectVector
投影了
[0]
垂直体。它计算出:

x: -0.1994540991160383
y: 0.17936202821347358
z: 0.9970982652556688

…这对我帮助不大。

要将3D点投影到屏幕坐标,相对于渲染器的画布,请执行以下操作:

var projector = new THREE.Projector();
var pos = projector.projectVector( position, camera );

var xcoord = Math.round( (  pos.x + 1 ) * canvas.width  / 2 );
var ycoord = Math.round( ( -pos.y + 1 ) * canvas.height / 2 );
其中
canvas
在本例中是
renderer.domeElement

可见世界左上角的一个点将投影到(0,0)


three.js r.53

要将3D点
位置
投影到相对于渲染器画布的屏幕坐标,请执行以下操作:

var projector = new THREE.Projector();
var pos = projector.projectVector( position, camera );

var xcoord = Math.round( (  pos.x + 1 ) * canvas.width  / 2 );
var ycoord = Math.round( ( -pos.y + 1 ) * canvas.height / 2 );
其中
canvas
在本例中是
renderer.domeElement

可见世界左上角的一个点将投影到(0,0)


three.js r.53

我找到了解决方案。左上角的点实际上是
平面
顶点的0索引,但是您还必须考虑已经执行的变换

function calculateLayer()
{
    // multiplyVector3 applies the performed transformations to the object's coordinates.
    var topLeft = tubeCard.matrixWorld.multiplyVector3( tubeCard.geometry.vertices[0].clone() );
    // index 24 is the bottom right, because the plane has 4x4 faces
    var bottomRight = tubeCard.matrixWorld.multiplyVector3( tubeCard.geometry.vertices[24].clone() );
    return {
            topLeft: convert3Dto2D( topLeft ),
            bottomRight: convert3Dto2D( bottomRight )
        }
}

function convert3Dto2D( positionVector )
{
    var projector = new THREE.Projector();
    var pos = projector.projectVector( positionVector, camera );

    var xcoord = Math.round( (  pos.x + 1 ) * window.innerWidth  / 2 );
    var ycoord = Math.round( ( -pos.y + 1 ) * window.innerHeight / 2 );

    return { x: xcoord, y: ycoord };
}

因此,一旦你有了正确的坐标,应用了变换,你只需要使用三维到二维的转换,多亏了WestLangley。

我找到了解决方案。左上角的点实际上是
平面
顶点的0索引,但是您还必须考虑已经执行的变换

function calculateLayer()
{
    // multiplyVector3 applies the performed transformations to the object's coordinates.
    var topLeft = tubeCard.matrixWorld.multiplyVector3( tubeCard.geometry.vertices[0].clone() );
    // index 24 is the bottom right, because the plane has 4x4 faces
    var bottomRight = tubeCard.matrixWorld.multiplyVector3( tubeCard.geometry.vertices[24].clone() );
    return {
            topLeft: convert3Dto2D( topLeft ),
            bottomRight: convert3Dto2D( bottomRight )
        }
}

function convert3Dto2D( positionVector )
{
    var projector = new THREE.Projector();
    var pos = projector.projectVector( positionVector, camera );

    var xcoord = Math.round( (  pos.x + 1 ) * window.innerWidth  / 2 );
    var ycoord = Math.round( ( -pos.y + 1 ) * window.innerHeight / 2 );

    return { x: xcoord, y: ycoord };
}

因此,一旦你有了正确的坐标,并应用了变换,你只需要借助WestLangley使用3d到2d的转换。

我循环了平面的每个垂直面,答案应该是125,但没有接近的值。或者重新表述这个问题:如何找到平面左上角的3D点位置?如果我从位置向量中减去左上角的垂直向量,上面的脚本给出了错误的结果,我遗漏了什么?我不知道你遗漏了什么,因为我不知道你在做什么。你能提供一个简单的实例吗?(jsfiddle)记住,我无法为您调试代码,但我会尽力帮助您。我解决了它。我想我解释得很好:(我在下面贴出答案。我在平面的每个垂直点上循环,答案应该是125,但没有接近的值。或者重新表述问题:如何找到平面的左上角3D点位置?如果我从位置向量中减去左上角垂直向量,上面的脚本给出了错误的结果,我遗漏了什么?我遗漏了我不知道你遗漏了什么,因为我不知道你在做什么。你能提供一个简单的、真实的例子吗?(JSFIDLE)记住,我不能为你调试代码,但我会尽力帮助你。我解决了它。我想我解释得很好:(我把答案贴在下面。谢谢。我一直在寻找这个解决方案,因为其他人认为没有对这一点进行任何转换。谢谢。我一直在寻找这个解决方案,因为其他人认为没有对这一点进行任何转换。