#3d #geometry #textures
#3D #геометрия #Текстуры
Вопрос:
Я пытаюсь создать 3D-сферу, и в настоящее время у меня есть сфера, состоящая из точек, хотя мне нужно применить к ней текстуру, и это вызывает у меня проблемы.
Код для генерации сферы выглядит следующим образом:
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
}
Я был бы очень признателен за любую помощь, которую я могу получить!
Комментарии:
1. Это потому, что вы вообще не знаете, как выполнять отображение текстур в OpenGL? Или вам нужна помощь в вычислении координат текстуры для вершин?
2. Я вообще мало что знаю о отображении текстур, когда впервые пробую. Немного читал об этом, но не смог понять, как сделать так, чтобы это соответствовало моему коду
3. Вероятно, было бы неплохо сначала попробовать сопоставить текстуры с простым квадратом.
4. Я думаю, у меня нет на это времени.. это для школьного проекта, и скоро время для сдачи, поэтому я обратился сюда 🙂
5. Я настоятельно рекомендую вам немного углубиться в основы OpenGL и компьютерной графики в целом, если вы хотите действительно понимать, что вы делаете. И если вы не хотите, то это место не www.write-my-homework.com .
Ответ №1:
Хотя теоретически вы можете текстурировать точки, один пиксель текстуры означает, что вам потребуется много точек для создания узнаваемой карты. Из того, что я могу сказать, вам нужно нарисовать свою сферу в виде набора треугольников, к которым затем можно применять текстуры. Фактически это означает просто объединение точек, которые вам нужны для создания граней. Вместо GL_POINTS
того, чтобы вы, вероятно, хотели посмотреть на использование GL_TRIANGLES
— см. Руководство по программированию OpenGL на линиях точек и полигонах для правильного объяснения.
Комментарии:
1. Похоже, что нет GL_TRIANGLE_ARRAY, Только GL_TRIANGLE и т. Д. Выглядит не совсем правильно
2. Вы можете идеально текстурировать точки (если каждая точка имеет значимую текстурную координату), почему это не должно быть возможным. Каждая точка создает хотя бы один фрагмент и имеет текстурную координату, что еще нужно? Но, конечно, это может быть не то, чего хочет OP, но только потому, что текстура на одном пикселе не имеет особого смысла в классическом смысле текстуры, это не значит, что это невозможно. Поскольку конвейер OpenGL определяет, что возможно.
3. Простая замена
GL_POINTS
наGL_TRIANGLES
волшебным образом не создаст правильную поверхность. Скорее всего, вам нужно будет изменить порядок вершин, которые вы отправляете в GL, чтобы сформировать треугольники. ИGL_TRIANGLE_ARRAY
в любом случае это мусор.4. Как мне изменить их порядок? / знать, какой порядок для них правильный
5. Если текстурированная точка представляет собой один пиксель текстуры, вы можете просто раскрасить их, поэтому, даже если вы можете их текстурировать, если у вас нет очень подробного облака точек, оно не будет очень узнаваемым, а также сильно отличается от моей интерпретации вопроса. Я отредактирую соответствующим образом.