Javascript 在Three.js projetion中计算顶部、左侧、宽度和高度
我正在努力解决一个问题:我需要在WebGL动画上放置一个DIV。我旋转一个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点投影到屏幕坐标,
网格
,基于一个平面几何体
占据一个矩形大小,然后我想在那里放置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)记住,我不能为你调试代码,但我会尽力帮助你。我解决了它。我想我解释得很好:(我把答案贴在下面。谢谢。我一直在寻找这个解决方案,因为其他人认为没有对这一点进行任何转换。谢谢。我一直在寻找这个解决方案,因为其他人认为没有对这一点进行任何转换。