做一年牛犊 2015-06-19 07:35 采纳率: 0%
浏览 769

DX绘制一个椎体,麻烦大家给看看,顶点和索引序列有问题么?

const int circlePoints = 4;//锥低边的定点数
const int radiu = 1;//锥底半径

VB->Lock(0, 0, (void**)&vertices, 0);

// vertices of a unit centrum
for (int i = 0;i<=circlePoints+1;i++)
{
    if (i==0)
    {
        vertices[i] = ColorVertex(0.0f, 1.0f, 0.0f,D3DCOLOR_XRGB(0,255,0));
    }else if (i==1)
    {
        vertices[i] = ColorVertex(0.0f, -1.0f, 0.0f,D3DCOLOR_XRGB(0,0,255));
    }
    else{
        vertices[i] = ColorVertex(radiu*cos((i - 2)*2*D3DX_PI/circlePoints), -1.0f, radiu*sin((i - 2)*2*D3DX_PI/circlePoints),D3DCOLOR_XRGB(255,0,0));
    }
}

VB->Unlock();

// define the triangles of the cube:
WORD* indices = 0;
IB->Lock(0, 0, (void**)&indices, 0);

for (int j=0;j < circlePoints;j++)
{
    if(j==circlePoints - 1)
    {
        indices[j*6] = j%2 == 0?0:j+2; indices[j*6+1] = j%2 == 0?j+2:0; indices[j*6+2] = j%2 == 0?2:2;
        indices[j*6+3] = j%2 == 0?1:j+2; indices[j*6+4] = j%2 == 0?j+2:1; indices[j*6+5] = j%2 == 0?2:2;
    } 
    else
    {
        indices[j*6] = j%2 == 0?0:j+2; indices[j*6+1] = j%2 == 0?j+2:0; indices[j*6+2] = j%2 == 0?j+3:j+3;
        indices[j*6+3] = j%2 == 0?1:j+2; indices[j*6+4] = j%2 == 0?j+2:1; indices[j*6+5] = j%2 == 0?j+3:j+3;
    }
}

可是就是画不出来,当circlePoints是3的时候能画出来一个面,其它值什么都没有
  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-27 15:24
    关注

    该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

    根据您提供的代码,存在一些问题导致椎体无法正确绘制。以下是我发现的问题和建议的修正方法:

    1. 在定义顶点的循环中,您只为顶点数组中的前circlePoints+2个元素分配了空间,但在计算顶点坐标时,循环的结束条件是i <= circlePoints+1,这会导致访问超出数组范围。建议将循环条件更改为i < circlePoints+2。

    2. 在计算顶点坐标时,您使用了弧度制而不是角度制。cos和sin函数期望弧度作为输入。如果想使用角度制,需要将角度转换为弧度。建议使用D3DXToRadian函数将角度转换为弧度。

    3. 在索引序列的计算中,您有一个错误的逻辑。在最后一个循环迭代中,当j等于circlePoints-1时,应该使用特殊的索引计算方式,因为需要连接最后一个顶点和起始顶点。目前的逻辑会导致使用错误的索引值。

    下面是修正后的代码:

    const int circlePoints = 4; // 锥低边的顶点数
    const float radius = 1.0f;  // 锥底半径
    
    VB->Lock(0, 0, (void**)&vertices, 0);
    
    // 锥顶点和底面顶点
    vertices[0] = ColorVertex(0.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0));
    vertices[1] = ColorVertex(0.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255));
    
    // 底面顶点
    for (int i = 2; i < circlePoints + 2; i++)
    {
        float angle = (i - 2) * 2 * D3DX_PI / circlePoints;
        vertices[i] = ColorVertex(radius * cos(angle), -1.0f, radius * sin(angle), D3DCOLOR_XRGB(255, 0, 0));
    }
    
    VB->Unlock();
    
    // 定义椎体的三角形面片
    WORD* indices = nullptr;
    IB->Lock(0, 0, (void**)&indices, 0);
    
    for (int j = 0; j < circlePoints; j++)
    {
        indices[j * 6] = 0;
        indices[j * 6 + 1] = j + 2;
        indices[j * 6 + 2] = (j + 1) % circlePoints + 2;
    
        indices[j * 6 + 3] = 1;
        indices[j * 6 + 4] = (j + 1) % circlePoints + 2;
        indices[j * 6 + 5] = j + 2;
    }
    
    IB->Unlock();
    

    请注意,以上修正是基于您的代码进行的,但我无法验证它们是否与您的整体实现一致。建议在尝试修复问题之前备份原始代码,以免丢失任何重要数据。

    评论

报告相同问题?

悬赏问题

  • ¥15 第一行输入n,第二行输入a b c输出的字符向后平移n个位置,当移动到z时,重新返回a开始
  • ¥15 为什么跑这个代码,文件显示不在呀
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题