如何将二维坐标投影到三维空间中?
例如,我有一张宽度为256像素的图片(表示为一个粒子)。如果我假设这张图片在二维空间中以原点(0,0)为中心,则正方形的垂直边缘位于x = 128和x = -128处。
因此,当这个图像(粒子)被放置在Three.js场景中的原点(0,0),相机与原点的距离为CamZ时,该怎样将原始的2D坐标投影到3D中,从而告诉我图像(粒子!)在屏幕上以three.js单位出现的宽度。
如何将二维坐标投影到三维空间中?
例如,我有一张宽度为256像素的图片(表示为一个粒子)。如果我假设这张图片在二维空间中以原点(0,0)为中心,则正方形的垂直边缘位于x = 128和x = -128处。
因此,当这个图像(粒子)被放置在Three.js场景中的原点(0,0),相机与原点的距离为CamZ时,该怎样将原始的2D坐标投影到3D中,从而告诉我图像(粒子!)在屏幕上以three.js单位出现的宽度。
-128, 128, 0
、128, 128, 0
、-128, -128, 0
和128, -128, 0
。然后使用Projector
将该几何体使用相机进行投影。这将给你一个投影点数组,应该在-1到1之间。然后需要将其乘以视口大小。还有另一种方法可以实现。可以通过启发式方法近似计算2D和3D之间的精确转换。通常,这比使用three.js投影向量更难实现,但是通过指数转换,您可以映射许多2D/3D转换。
这里的想法是使用指数缓动函数来计算转换。大多数库使用的缓动函数(例如jQuery UI)是Robert Penner Easing functions。
easeOutExpo函数在近似2D/3D转换方面表现出色。通常会像这样:
// easeOutExpo(time, base, change, duration)
var xPosition3D = xPosition2D * expo(xPosition2D, 0, coefficient, xMax2D);
这需要一个系数,具体数字取决于3D相机的宽高比和焦距。通常,类似-.2这样的数字效果不错。
我知道这个解释可能不够充分,但希望能指引您朝着正确的方向前进。