2010-09-24 56 views
1

好吧,这是一个很难回答的问题。我正在一个顶点数组中创建一个立方体和一个金字塔。我的问题是只旋转金字塔顶点而不是立方体顶点,但我不知道任何可以旋转某个顶点的函数。如果我尝试旋转顶点,我会得到金字塔和立方体旋转。directx rotation C++

回答

2

要么

  • 把立方体和 不同顶点数组金字塔并使用 不同的变换来呈现每个阵列

  • 申请的旋转在一个顶点 着色器,并通过一些辅助 每个顶点信息h让顶点 着色器决定是否应将每个顶点 视为多维数据集或金字塔的一部分(即,在每种情况下应用不同的变换)。这有点像使用“混合重量”来做“vertex blending”;除非你只对二进制情况感兴趣。
+0

特别针对顶点着色器+1。把它称为“着色器”对我来说似乎很奇怪,因为这是关于如何将变换融合到骨骼模型的关节中(例如,当腿弯曲时如何处理膝盖)而不是关于颜色/纹理/等,但是我可以'我想你应该怪你。 – Steve314 2010-09-24 20:56:15

+0

我知道你的意思;大多数科学和工程领域都被赋予了奇怪的命名法,这种命名法有一次是有道理的,但现在看起来很不正常(天文学的“行星状星云”特别使我感到不安)。 – timday 2010-09-24 21:11:14

1

首先想到 - 确保金字塔和立方体的顶点在数组中占据单独的非重叠范围。旋转金字塔顶点时,只告诉DirectX该数组的范围(使用基本指针和范围的大小而不是整个数组)。

现在将检查的DirectX API的...

编辑

证实。主要的功能就是...

D3DXVECTOR4 * D3DXVec4TransformArray(D3DXVECTOR4 * pOut, 
            UINT OutStride, 
            CONST D3DXVECTOR4* pV, 
            UINT VStride, 
            CONST D3DXMATRIX* pM, 
            UINT n 
            ); 

在C++中,数组的子范围是在许多方面本身就是一个数组,或者更重要的是,它主要是只是一个内存块,没有迹象内本身就是它的边界。因此,您只需传入不同的pV和不同的n以指示要应用转换的子范围,并且就函数而言,即整个数组。您可能需要单独复制未转换的部分 - 我期望的memcpy作业。

步幅值通常只是一个向量的大小加上任何对齐填充,但也有可能对此进行“说谎”,并转换数组中的每个第三个向量。

+0

这将工作......但它基本上等同于每次要旋转对象(然后顶点缓冲区需要再次上传到GPU)时重新生成顶点数组(使用CPU)。这并不是真正使用现代图形硬件的设计。虽然对于简单的情况它可以很好地工作,但这种方法不会扩展到数十万个顶点,在这些顶点中,您确实需要最大限度地减少所需的CPU干预量,并让GPU继续做下去。 – timday 2010-09-24 21:24:12

+0

@timday - 好的。我不是任何方式的专业游戏开发者(只是模糊地感兴趣),并且很可能在DirectX中有很多我不知道的东西。 – Steve314 2010-09-24 21:44:55