对3D球体进行纹理处理(找不到帮助我的帖子)
我正在尝试创建一个3D球体,目前我有一个由点组成的球体,但我需要对其应用纹理,这给我带来了问题 生成球体的代码如下所示:对3D球体进行纹理处理(找不到帮助我的帖子),3d,geometry,textures,3d,Geometry,Textures,我正在尝试创建一个3D球体,目前我有一个由点组成的球体,但我需要对其应用纹理,这给我带来了问题 生成球体的代码如下所示: public Sphere(float radius, double step) { this.mRaduis = radius; this.mStep = step; sphereVertex = ByteBuffer.allocateDirect(400000) .order(ByteOrder.nativeOr
public Sphere(float radius, double step) {
this.mRaduis = radius;
this.mStep = step;
sphereVertex = ByteBuffer.allocateDirect(400000)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
mPoints = build();
Log.d("ALIS CHECK!!!!!", " COUNT:" + mPoints);
}
public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, sphereVertex);
gl.glEnable(GL10.GL_TEXTURE_2D); // workaround bug 3623
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, sphereVertex);
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_POINTS, 0, mPoints);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
private int build() {
double dTheta = mStep * DEG;
double dPhi = dTheta;
int points = 0;
for (double phi = -(Math.PI); phi <= Math.PI; phi += dPhi) {
// for each stage calculating the slices
for (double theta = 0.0; theta <= (Math.PI * 2); theta += dTheta) {
sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math
.cos(theta))); //y-coord
sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math
.sin(theta))); //z
sphereVertex.put((float) (mRaduis * Math.cos(phi))); //x
points++;
}
}
public SphereRenderer(Context context) {
mSphere = new Sphere(1, 25);
this.context = context;
vibrator = SphereActivity.getVibrator();
sphereActivity = SphereActivity.getInstance();
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
Sphere.loadTexture(gl, context, R.drawable.android);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -4.0f);
rotateSphere(gl, startTime);
// gl.glRotatef(xRot, 0.0f, 1.0f, 0.0f);
// gl.glRotatef(yRot, 1.0f, 0.0f, 0.0f);
mSphere.draw(gl);
numFrames++;
long fpsElapsed = System.currentTimeMillis() - fpsStartTime;
if (fpsElapsed > 5 * 1000) { // every 5 seconds
float fps = (numFrames * 1000.0F) / fpsElapsed;
Log.d("FPS", "Frames per second: " + fps + " (" + numFrames
+ " frames in " + fpsElapsed + " ms)");
fpsStartTime = System.currentTimeMillis();
numFrames = 0;
}
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
startTime = System.currentTimeMillis();
fpsStartTime = startTime;
numFrames = 0;
if (height == 0) {
height = 1;
}
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
// Calculate The Aspect Ratio Of The Window
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW); // Select The Modelview Matrix
gl.glLoadIdentity(); // Reset The Modelview Matrix
}
我真的很感激能得到的所有帮助 虽然理论上可以对点进行纹理处理,但一个像素的纹理意味着您需要很多点来创建可识别的贴图。根据我所能告诉你的,你需要把你的球体画成一组三角形,然后你可以对它们应用纹理。实际上,这意味着只需组合创建面所需的点。与其使用
GL_点
,您可能想看看如何使用GL_三角形
——有关正确的解释,请参阅。是否您根本不知道如何在OpenGL中进行纹理映射?或者你需要帮助计算顶点的纹理坐标吗?我对纹理贴图知之甚少,第一次尝试的时候。我已经读了一些关于它的书,但是还没有弄明白如何使它适合我的代码。首先尝试纹理映射一个简单的四边形可能是个好主意。我想没有时间了。。这是一个学校项目,很快就要交上来了,这就是我在这里的原因:)我强烈建议你深入研究一下OpenGL和计算机图形学的基础知识,如果你想真正了解你在做什么的话。如果你不想,那么这个地方就不是www.write-my-homography.com。这里似乎没有GL_三角形数组,只有GL_三角形等。看起来不太正确,尽管你可以完美地对点进行纹理处理(只要每个点都有一个有意义的纹理坐标),为什么这不可能呢。每个点至少生成一个片段,并具有纹理坐标,还需要什么?当然,这可能不是OP想要的,但仅仅因为单个像素上的纹理在纹理的经典意义上没有多大意义并不意味着它不可能。因为OpenGL管道定义了什么是可能的。仅仅用GL\u三角形替换GL\u点
并不能神奇地生成正确的曲面。您很可能需要对发送到GL的顶点重新排序,以形成三角形。而且GL\u TRIANGLE\u ARRAY
无论如何都是垃圾。我该如何对它们进行重新排序?/知道它们的正确顺序如果纹理点是纹理的单个像素,你也可以对它们进行着色,因此即使你可以对它们进行纹理处理,除非你有一些非常详细的点云,否则它也不会很容易识别,而且与我对这个问题的解释有很大不同。我将据此进行编辑。