我遇到了正确的球体映射问题。我使用世界地图来显示出错的地方。北美从上到下出现在前面,而南美则在另一边颠倒,亚洲等大陆甚至都不在地图上。
Screenshot http://i.troll.ws/3aedbe4b.png
以下代码是sphere-object
class Shape {
public void drawSphere(double radius, int slices, int stacks) {
gl.glEnable(GL_TEXTURE_2D);
head.bind(gl); //Method that binds the world-map (for testing) texture.
gl.glBegin(GL_QUADS);
double stack = (2 * PI) / stacks;
double slice = (2 * PI) / slices;
for (double theta = 0; theta < 2 * PI; theta += stack) {
for (double phi = 0; phi < 2 * PI; phi += slice) {
Vector p1 = getPoints(phi, theta, radius);
Vector p2 = getPoints(phi + slice, theta, radius);
Vector p3 = getPoints(phi + slice, theta + stack, radius);
Vector p4 = getPoints(phi, theta + stack, radius);
double s0 = theta / (2 * PI);
double s1 = (theta + stack) / (2 * PI);
double t0 = phi / (2 * PI);
double t1 = (phi + slice) / (2 * PI);
vectorToNormal(norm(p1));
gl.glTexCoord2d(s0, t0);
vectorToVertex(p1);
vectorToNormal(norm(p2));
gl.glTexCoord2d(s0, t1);
vectorToVertex(p2);
vectorToNormal(norm(p3));
gl.glTexCoord2d(s1, t1 );
vectorToVertex(p3);
vectorToNormal(norm(p4));
gl.glTexCoord2d(s1, t0);
vectorToVertex(p4);
}
}
gl.glEnd();
gl.glDisable(GL_TEXTURE_2D);
}
Vector getPoints(double phi, double theta, double radius) {
double x = radius * cos(theta) * sin(phi);
double y = radius * sin(theta) * sin(phi);
double z = radius * cos(phi);
return new Vector(x, y, z);
}
我该如何解决?我试过交换一些坐标和其他东西,但这让我更加困惑。
此外,当我将纹理绑定到它时,似乎有一些文物。这可以解决吗?
答案 0 :(得分:2)
你的循环都是从0到2 * PI。其中一个应该只是半圈。你把球体翻了一倍,导致了狡猾的地图和奇怪的人工制品。
答案 1 :(得分:0)
感谢JasonD,这解决了它。
for (double theta = 0; theta < 2 * PI; theta += stack) {
for (double phi = 0; phi < 1 * PI; phi += slice) {
Vector p1 = getPoints(phi, theta, radius);
Vector p2 = getPoints(phi + slice, theta, radius);
Vector p3 = getPoints(phi + slice, theta + stack, radius);
Vector p4 = getPoints(phi, theta + stack, radius);
double s0 = theta / (2 * PI);
double s1 = (theta + stack) / (2 * PI);
double t0 = phi / (1 * PI);
double t1 = (phi + slice) / (1 * PI);