如何将坐标存储在c#中以便在图形引擎中使用



我正在努力了解三维图形是如何整体工作的,我遇到了如何存储坐标的问题。我的挑战是用最小的依赖性来编程整个代码,因为我计划能够将其移植到几种语言。我对c#很陌生,我想能够调用这些变量,这些变量将用Vert.x或类似的东西预先设置。我的投影数学是

r=w/h,a=1/tan(θ/2(,投影x=arx/z,投影y=ay/z坐标不需要atm,但它将是q=(zfar/(zfar znear(投影z=zq-znear*q

我也不想使用矩阵。对于坐标,我需要能够在每个顶点输入它们。我还希望能够以某种方式将许多顶点存储在一个大列表中。如有任何帮助,我们将不胜感激。我会回答任何问题。在我至少解决了这个问题之前,无法真正创建代码,因为一切都是基于这个构建的我还需要为每个三角形存储3组坐标

在c++中,代码将类似于这个

struct vec3d
{
float x, y, z;
};
struct triangle
{
vec3d p[3];
};
struct mesh
{
vector<triangle> tris;
};
mesh meshCube;
meshCube.tris = {
// SOUTH
{ 0.0f, 0.0f, 0.0f,    0.0f, 1.0f, 0.0f,    1.0f, 1.0f, 0.0f },
{ 0.0f, 0.0f, 0.0f,    1.0f, 1.0f, 0.0f,    1.0f, 0.0f, 0.0f },
// EAST                                                      
{ 1.0f, 0.0f, 0.0f,    1.0f, 1.0f, 0.0f,    1.0f, 1.0f, 1.0f },
{ 1.0f, 0.0f, 0.0f,    1.0f, 1.0f, 1.0f,    1.0f, 0.0f, 1.0f },
// NORTH                                                     
{ 1.0f, 0.0f, 1.0f,    1.0f, 1.0f, 1.0f,    0.0f, 1.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f,    0.0f, 1.0f, 1.0f,    0.0f, 0.0f, 1.0f },
// WEST                                                      
{ 0.0f, 0.0f, 1.0f,    0.0f, 1.0f, 1.0f,    0.0f, 1.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f,    0.0f, 1.0f, 0.0f,    0.0f, 0.0f, 0.0f },
// TOP                                                       
{ 0.0f, 1.0f, 0.0f,    0.0f, 1.0f, 1.0f,    1.0f, 1.0f, 1.0f },
{ 0.0f, 1.0f, 0.0f,    1.0f, 1.0f, 1.0f,    1.0f, 1.0f, 0.0f },
// BOTTOM                                                    
{ 1.0f, 0.0f, 1.0f,    0.0f, 0.0f, 1.0f,    0.0f, 0.0f, 0.0f },
{ 1.0f, 0.0f, 1.0f,    0.0f, 0.0f, 0.0f,    1.0f, 0.0f, 0.0f },
};

您的vec3d结构很好(您需要添加一些东西,比如addition/等等…(我自己做了发动机,下面是我的做法。

  • 我有一个网格类(带有接口和其他东西(,它包含:
    • 列表(vec3d(
    • 列表(三角形(
    • 当然还有其他东西(纹理/法线/颜色等(
  • 三角形类别:
    • 三角形索引的列表(uint(

每个三角形索引都指向网格列表索引。

将其映射到图形卡时:

foreach (var face in Mesh.Faces)
if (!face.IsDeleted)
{
var indices = face.GetVertexIndexes();
foreach (var vertexIndex in indices)
array[index++] = vertexIndex;
}

其中";阵列";是指向将映射到GPU 上的索引数组的指针

以及用于映射顶点(PositionBuffer是将在GPU上映射的vec3d阵列(:

PositionBuffer = Mesh.Vertices.Select((x) => x.Position).ToArray().GenVertexBuffer(VBOConfig.Vec3, BufferUsage.DynamicDraw);

最新更新