计算圆的顶点

4

我有一个简单的程序,它画了一个圆形 :/ 这个程序运行得很好...

for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( 360 - ((k-1) * dstep) );
 vertices[k].y = sin_d( 360 - ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}
...
//Now draw it
sceGumDrawArray(GU_TRIANGLE_FAN, GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D, n+1+1, 0, vertices);

但是这个不行:
for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( ((k-1) * dstep) );
 vertices[k].y = sin_d( ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}

但是这不应该是相同的吗 - 只是第一个循环顺时针计算顶点,第二个逆时针计算? 只是有些尴尬的是它没有使用第二个示例绘制顶点...

或者我太蠢了?


如果您可以在调试器中运行此代码,或将值打印到屏幕上,则需要查看您正在计算的值。查看输入cos_d/sin_d的内容,并查看这些值是否符合您的预期。一旦完成此操作,请将这些值输入cos_d/sin_d,并将其与您预期的类型的值进行比较,或将其与科学计算器输出的值进行比较。 - Merlyn Morgan-Graham
你想要习惯这样做的原因是图形编程需要大量的数学知识,而且很容易出错。调试器或调试打印语句是防止疯狂的唯一方法 :) - Merlyn Morgan-Graham
4个回答

6

由于背面剔除,它可能不会被绘制。

"如果用户指定正面多边形具有顺时针绕序,如果在屏幕上投影的多边形具有逆时针绕序,则它已经被旋转以面向远离相机的方向,并且不会被绘制。"


这正是我个人的看法。我想不出其他任何解释。 - valdo
你可以检查一下是否可以在PSP SDK中禁用背面剔除。另一种方法是将相机移动到对象的另一侧,看看它是否开始绘制 :) - Merlyn Morgan-Graham

2

我不太确定您是如何绘制圆形的(我看到您创建了一个顶点列表,但对这些的渲染一无所知),但通常情况下,当您从顺时针反转为逆时针时,您最终会得到倒置的法线,这意味着您正在查看圆形的背面。而且,就像大多数API一样,当查看某些没有体积的东西的背面时,它不会被渲染。

这被称为背面剔除。


0

我不知道你在使用哪个库,但你确定你的代码中没有混淆弧度和角度吗?sin和cos函数是采用弧度还是角度?


考虑到它可以单向工作,这不太可能是问题所在。我想cos_d中的 _d 表示“度数”。 - Troubadour

0

假设dstep等于360 / n?

从美学的角度来看,使用GL_TRIANGLE_FAN时,您可能希望第一个点是圆的中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接