gpt4 book ai didi

c++ - OpenGL 半球纹理贴图

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:02 25 4
gpt4 key购买 nike

我需要在 opengl 中有一个半球。我找到了一个 drawSphere 函数,我对其进行了修改以绘制一半的拉特(最终绘制了一半的球体),这正是我想要的。它正确地做到了这一点。

但是,我不知道我应该如何使用 glTexCoordf 来使纹理正确映射到这个半球体上。我对 opengl 真的不是很好,我尝试了无数种变体,但我就是无法让纹理在其上正确显示。

void drawHemisphere(double r, int lats, int longs) 
{
int i, j;
int halfLats = lats / 2;
for(i = 0; i <= halfLats; i++)
{
double lat0 = M_PI * (-0.5 + (double) (i - 1) / lats);
double z0 = sin(lat0);
double zr0 = cos(lat0);

double lat1 = M_PI * (-0.5 + (double) i / lats);
double z1 = sin(lat1);
double zr1 = cos(lat1);

glBegin(GL_QUAD_STRIP);
for(j = 0; j <= longs; j++)
{
double lng = 2 * M_PI * (double) (j - 1) / longs;
double x = cos(lng);
double y = sin(lng);

// glTexCoordf()
glNormal3f(x * zr0, y * zr0, z0);
glVertex3f(x * zr0, y * zr0, z0);

// glTexCoordf()
glNormal3f(x * zr1, y * zr1, z1);
glVertex3f(x * zr1, y * zr1, z1);
}
glEnd();
}
}

有人知道我应该输入什么值吗?或者我需要为此计算什么?

谢谢!

最佳答案

基本上,您不需要任何花哨的东西。纹理坐标空间的范围从零到一。因此,为中间的顶点选择一些中间值。没有图像我无法更彻底地解释它,所以我能做的最好的就是将你指向这篇文章:UV mapping , 这是一个很好的起点。希望这有助于入门。

这是我的猜测:

{
double lng = 2 * M_PI * (double) (j - 1) / longs;
double x = cos(lng);
double y = sin(lng);

double s1, s2, t;
s1 = ((double) i) / halfLats;
s2 = ((double) i + 1) / halfLats;
t = ((double) j) / longs;

glTexCoord2d(s1, t);
glNormal3d(x * zr0, y * zr0, z0);
glVertex3d(x * zr0, y * zr0, z0);

glTexCoord2d(s2, t);
glNormal3d(x * zr1, y * zr1, z1);
glVertex3d(x * zr1, y * zr1, z1);
}

请记住在 OpenGL 中正确设置纹理。带有纹理的示例调用:

    glActiveTexture(GL_TEXTURE0);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);

// texture must be bound & enabled
texture.bind();
texture.enable();
drawHemisphere(1, 40, 40);
texture.disable();

我是用Java+JOGL来测试的,所以不是一对一的C++方案,但是概念上应该是一样的。至少你有适当的 glTexCoord2d() 调用。

关于c++ - OpenGL 半球纹理贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3276390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com