将 3 维转换为 2 维
轴告诉我们如何移动
要在第一个维度 x 中找到一个点,请沿 x 轴从左到右移动。要在第二维 y 中找到一个点,您必须整合第一维和第二维,因此从左到右的第一个 x,一旦你有了它,然后沿着屏幕向下的 y 轴第二个。
对于每个维度,您都依赖于前一个维度的定位。它还依赖于轴,x 轴和 y 轴彼此成 90 度,但它们可能在 45 或 120 度,这对于查找点的 2D 坐标没有任何区别。首先沿 X 轴,然后 Y 沿 y 轴。
向量函数
因为显示只是二维的,所以轴可以表示为二维向量。向量的长度告诉轴的比例。因此,对于 x 轴,如果我将轴定义为 2D(显示坐标)矢量 (2,0),那么我说它在 x 坐标中的每个单位都经过 2 和 0。如果我想在 x 坐标 10 处,我将它乘以轴以获得屏幕位置。
因此对代码...
function screenCoord(x,y){ // creates a coordinate in screen space
// screen space is always in pixels
// screen space always has the origin (0,0) at the top left
return {
x : x,
y : y,
}
}
function screenVector(x,y){ // a vector in screen space it points in a direction
// and its is in pixels
return { // basically identical to the last function
x : x,
y : y,
}
}
因此,让我们定义我将 (2,0) 放大 2 的 X 轴
var xAxis = screenVector(2,0);
现在斧头位置说 10
var xPos = 10
要找到它的位置,我们需要沿 x 轴获取屏幕坐标。我们通过将 xAxis 乘以 xPos 来做到这一点。为了更容易,我们可以创建一个向量乘法函数
function multiply(vector, value){
var x = vector.x * value; // multiply the vector x by value
var y = vector.y * value; // multiply the vector y by value
return screenCoord(x,y)
}
现在找到 xPos 的第一维 pos
var screenPos = multiply(xAxis, xPos); // returns the screen position of x = 10
现在要做第二个维度,我们将其添加到前面。让我们定义一个函数来将一个向量添加到另一个向量
function add(vector1, vector2){ // adds two vectors returning a new one
var x = vector1.x + vector2.x;
var y = vector1.y + vector2.y;
return screenCoord(x,y);
}
所以现在让我们创建 y 轴
var yAxis = new screenVector(0,2); // y goes down the screen and has no x change
和 y 位置
var posY = 10;
所以现在让我们从 x 开始
var screenPosX = multiply(xAxis,posX); // get the x position on the screen
var screenPosY = multiply(yAxis,posY); // get the y position on the screen
现在我们将两个坐标的结果相加
var screenXY = add(screenPosX,screenPosY);
我们在屏幕上有一个 x = 10 和 y = 10 的坐标(在这种情况下,它位于 20 向下的像素位置 20 处。
第三维度
现在不用花太多时间来猜测第 3 个 z 维度会发生什么。对于 x 沿 x 轴,然后 y 沿 y 轴,然后 z 沿 z 轴
所以定义z轴
var yAxis = new screenVector(1,-1); // z axis along the diagonal from bottom left to top right
现在z坐标
var posZ = 10;
所以要找到我们的 3d 位置,x 沿其轴,然后沿其添加 y,然后沿其轴添加 z
var screenPosX = multiply(xAxis,posX); // get the x position on the screen
var screenPosY = multiply(yAxis,posY); // get the y position on the screen
var screenPosZ = multiply(zAxis,posZ); // get the z position on the screen
需要将它们加在一起
var screenXY = add(screenPosX,screenPosY);
然后 z
var screenXYZ = add(screenPosXY,screenPosZ);
在那里你有如何进行从一组坐标到另一组坐标的转换。它被称为变换
起源
我们缺少最后一点信息。起源。这是屏幕上坐标 0,0,0 (x,y,z) 所在的位置。它是变换的最后一部分,位于屏幕坐标 (x,y) 中
var origin = screenCoords(100,500); // set the origin at 100 pixels across 500 down
从最后的计算中我们得到屏幕空间中的 screenXYZ 坐标,我们需要将原点添加到它
screenXYZ = add(screenXYZ ,origin);
现在您可以在二维屏幕上从原点开始在坐标 (10,10,10) (x,y,z) 处绘制像素。
矩阵
希望对您有所帮助,如果您了解您刚刚学习了如何使用 3D 转换矩阵。它将 x、y、z 轴作为一组三个 2D 方向和原点坐标。矩阵执行相同的功能步骤,只是它在一个简单的数组中执行,这使得它更有效,并且遵循一些矩阵规则允许非常复杂的转换。例如,如果你想旋转,你需要做的就是改变轴的方向并且你已经旋转了对象。要更改比例,只需更改轴的长度,要移动对象只需更改原点的位置。