如何从 2 个向量构造顶点矩阵?
How do I construct a matrix of vertices from 2 vectors?
我正在用 C++ 编写一个与 Vulkan 交互的游戏引擎。为了让我能够在屏幕上绘制任何东西,我需要写顶点。
游戏引擎为 Vulkan 提供了一个稍微高级的接口,它需要能够从位置 Vector3 和大小 Vector3 构造顶点。
我对如何有效地解决这个问题一无所知,有人可以指出我正确的方向吗?谢谢!!
class SquareMatrix {
public:
Vector3 s1v1, s1v2, s1v3, s1v4, // Top
s2v1, s2v2, s2v3, s2v4, // Bottom
s3v1, s3v2, s3v3, s3v4, // Left
s4v1, s4v2, s4v3, s4v4, // Right
s5v1, s5v2, s5v3, s5v4, // Front
s6v1, s6v2, s6v3, s6v4; // Back
SquareMatrix(Vector3& v1, Vector3& v2) {
std::array<std::array<Vector3, 4>, 6> Square;
for(int a=0; a<=6; a++) {
for(int b = 0; b <= 4; b++) {
// Stumped!
}
}
}
};
无论如何,您应该做的第一件事是使用数组而不是大量字段来存储顶点。
我假设通过编写顶点,您是在调用 vkMapMemory
和 vkUnmapMemory
之间编写顶点(我不是 Vulkan 专家,哈哈)。在这种情况下,我能想到的最有效的方法是使用一个浮点数组而不是一个 Vertex3
s 数组(否则你必须一个一个地复制,或者你必须找到你的通过标准布局、对齐要求和其他比简单的浮点数组复杂得多的东西)的方式,并使用它来编写它。至于编辑浮点数组,那是相当简单的。另一个实际上等效的选项是浮点数的多维数组,并且在顶点数永远不会改变的情况下(在编译时已知),这也有效(无论如何,一个简单的数组只是模拟一个多维数组无论如何)。
这两个向量可能代表一个 "Axis Aligned Bounding Box" (AABB):https://en.m.wikipedia.org/wiki/Bounding_volume
AABB 是一个矩形长方体(即矩形的 3D 版本),其特点是其边缘与笛卡尔轴对齐。这意味着我们可以使用中心点和框在三个正交方向上的半范围(大小)或对应于框的最小角和最大角的两个顶点来定义任何 AABB。
因此,在代码中,您最好定义一个结构 AABB,其中包含两个顶点的名称,例如 minPoint 和 maxPoint。
另一件事是你不需要定义24个顶点。你只需要8个顶点。然后你需要定义 6 个面,每个面包含 3 个整数(三角形)或 4 个整数(四边形),整数是顶点的索引。 Vulkan 应该提供一个带有两个参数的渲染函数:顶点列表(可能是浮点数组)和面列表(可能是整数数组)。
希望对您有所帮助。
我正在用 C++ 编写一个与 Vulkan 交互的游戏引擎。为了让我能够在屏幕上绘制任何东西,我需要写顶点。
游戏引擎为 Vulkan 提供了一个稍微高级的接口,它需要能够从位置 Vector3 和大小 Vector3 构造顶点。
我对如何有效地解决这个问题一无所知,有人可以指出我正确的方向吗?谢谢!!
class SquareMatrix {
public:
Vector3 s1v1, s1v2, s1v3, s1v4, // Top
s2v1, s2v2, s2v3, s2v4, // Bottom
s3v1, s3v2, s3v3, s3v4, // Left
s4v1, s4v2, s4v3, s4v4, // Right
s5v1, s5v2, s5v3, s5v4, // Front
s6v1, s6v2, s6v3, s6v4; // Back
SquareMatrix(Vector3& v1, Vector3& v2) {
std::array<std::array<Vector3, 4>, 6> Square;
for(int a=0; a<=6; a++) {
for(int b = 0; b <= 4; b++) {
// Stumped!
}
}
}
};
无论如何,您应该做的第一件事是使用数组而不是大量字段来存储顶点。
我假设通过编写顶点,您是在调用 vkMapMemory
和 vkUnmapMemory
之间编写顶点(我不是 Vulkan 专家,哈哈)。在这种情况下,我能想到的最有效的方法是使用一个浮点数组而不是一个 Vertex3
s 数组(否则你必须一个一个地复制,或者你必须找到你的通过标准布局、对齐要求和其他比简单的浮点数组复杂得多的东西)的方式,并使用它来编写它。至于编辑浮点数组,那是相当简单的。另一个实际上等效的选项是浮点数的多维数组,并且在顶点数永远不会改变的情况下(在编译时已知),这也有效(无论如何,一个简单的数组只是模拟一个多维数组无论如何)。
这两个向量可能代表一个 "Axis Aligned Bounding Box" (AABB):https://en.m.wikipedia.org/wiki/Bounding_volume
AABB 是一个矩形长方体(即矩形的 3D 版本),其特点是其边缘与笛卡尔轴对齐。这意味着我们可以使用中心点和框在三个正交方向上的半范围(大小)或对应于框的最小角和最大角的两个顶点来定义任何 AABB。
因此,在代码中,您最好定义一个结构 AABB,其中包含两个顶点的名称,例如 minPoint 和 maxPoint。
另一件事是你不需要定义24个顶点。你只需要8个顶点。然后你需要定义 6 个面,每个面包含 3 个整数(三角形)或 4 个整数(四边形),整数是顶点的索引。 Vulkan 应该提供一个带有两个参数的渲染函数:顶点列表(可能是浮点数组)和面列表(可能是整数数组)。
希望对您有所帮助。