Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Misha_prog
0 / 0 / 0
Регистрация: 15.04.2013
Сообщений: 184
#1

Opengl es: вывод 3D моделей - Android

04.02.2015, 22:22. Просмотров 722. Ответов 1
Метки нет (Все метки)

Всем привет!!!! Пытаюсь разобраться как на экран выводить 3D модели, но почему то не получается.
Насколько я понял, единственное отличие в выводе куба допустим от 3D модели, это то что нам необходимо взять из 3d модели и записать в массив вершины, нормали, текстуры ? Вот, следуя этой логики я скачал пример из урока, там где выводят квадраты крутящиеся и точку света крутящуюся вокруг, метод которым я забираю координаты из 3D. вот. ( тут цвет я задал так для примера)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import android.content.Context;
import android.util.Log;
import com.example.misha.testdrawfigure.R;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class untitled {
    enum  State {
        START,
        VERTEX,
        NORMAL,
        TEXTURE,
        FINISH
 
    }
   public  static int countVerts ;
    public  static float [] vertexCount;
    public  static float [] vertexNormal;
    public static float [] vertexTexture;
    public static float [] colorsVer;
    public static void readFile(Context ctx, int id) {
        State state = State.START;
        List<String> list = new ArrayList<String>();
        InputStream inputStream = ctx.getResources().openRawResource(id);
        List<String> listVertex = new ArrayList<String>();
        List<String> listNormal = new ArrayList<String>();
        List<String> listTexture = new ArrayList<String>();
        BufferedReader br = null;
        try
        {
            br = new BufferedReader(
                    new InputStreamReader(
                            inputStream
                    )
 
            );
            String line = null;
            while (((line = br.readLine()) != null)) {
                switch (state) {
                    case START: { 
                        if (!line.equals("verts")) {
                            countVerts = Integer.parseInt(line);
                            state = State.VERTEX;
                        }
                        break;
                    }
 
                    case VERTEX: { 
                        if (line.equals("END")) { 
                            state = State.NORMAL;
                        }else {
                            listVertex.add(line);
                        }
                        break;
                    }
 
                    case NORMAL: { 
                        if (!line.equals("normals") && !line.equals("END")) {
                            listNormal.add(line);
                        }else if (line.equals("END")) {
                            state = State.TEXTURE;
                        }
                        break;
                    }
 
                    case TEXTURE: {
                        if (!line.equals("texture") && !line.equals("END")) {
                            listTexture.add(line);
                        }else if (line.equals("END")) {
                            state = State.FINISH;
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
            br.close();
        }catch (Exception e ) {
            Log.e("ErrorUSer", e.getMessage());
        }
        vertexCount = new float[listVertex.size()];
        vertexNormal = new float[listNormal.size()];
        vertexTexture = new float[listTexture.size()];
        for (int i = 0; i < listVertex.size(); ++i) {
            vertexCount[i] = Float.parseFloat(listVertex.get(i));
        }
        for (int i = 0; i < listNormal.size(); ++i) {
 
            vertexNormal[i] = Float.parseFloat(listNormal.get(i));
        }
        for (int i = 0; i < listTexture.size(); ++i) {
            vertexTexture[i] = Float.parseFloat(listTexture.get(i));
        }
 
        int colors = listVertex.size() / 3;
        colorsVer = new float[colors * 4];
        for (int i = 0; i < colors * 4; ++i) {
            if (i % 4 == 0) {
                colorsVer[i] = 1;
            }else
            {
                colorsVer[i] = 0.7f;
 
            }
        }
    };
}
и вот код который я взял и немного отредактировал ( то есть добавил вместо заданных вершин, считаынне из модели)
вот.( я пишу только конструктор, потому что остальной код схож с OPengl es второй урок
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.os.SystemClock;
import android.util.Log;
import com.example.misha.testdrawfigure.object.untitled;
public class FirstRenderer implements GLSurfaceView.Renderer{
    private float[] mModelMatrix = new float[16];
    private float[] mViewMatrix = new float[16];
    private float[] mProjectionMatrix = new float[16];
    private float[] mMVPMatrix = new float[16];
    private float[] mLightModelMatrix = new float[16];
    private final FloatBuffer mCubePositions;
    private final FloatBuffer mCubeColors;
    private final FloatBuffer mCubeNormals;
    private int mMVPMatrixHandle;
    private int mMVMatrixHandle;
    private int mLightPosHandle;
    private int mPositionHandle;
    private int mColorHandle;
    private int mNormalHandle;
    private final int mBytesPerFloat = 4;
    private final int mPositionDataSize = 3;
    private final int mColorDataSize = 4;
    private final int mNormalDataSize = 3;
    private final float[] mLightPosInModelSpace = new float[] {0.0f, 0.0f, 0.0f, 1.0f};
 
    private final float[] mLightPosInWorldSpace = new float[4];
    private final float[] mLightPosInEyeSpace = new float[4];
 
    private int mPerVertexProgramHandle;
    private int mPointProgramHandle;
 
    public FirstRenderer(Context ctx)
    {
        com.example.misha.testdrawfigure.object.untitled.readFile(ctx,  R.raw.farmhouse);
        final float[] cubePositionData = untitled.vertexCount;
        final float[] cubeColorData = untitled.colorsVer;
        final float[] cubeNormalData = untitled.vertexNormal;
        mCubePositions = ByteBuffer.allocateDirect(cubePositionData.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
        mCubePositions.put(cubePositionData).position(0);
 
        mCubeColors = ByteBuffer.allocateDirect(cubeColorData.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
        mCubeColors.put(cubeColorData).position(0);
 
        mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder()).asFloatBuffer();
        mCubeNormals.put(cubeNormalData).position(0);
    }
Но это все просто выводит точку..... может кто сталкивался с такой проблемой ? не могли бы подсказать?
Всем спасибо за внимание!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2015, 22:22     Opengl es: вывод 3D моделей
Посмотрите здесь:

Android OpenGL (Android)
Android OpenGL 1.1 Android
OpenGL ES Android
Android OpenGL
различие в GPS для различных моделей телефонов Android
Android Инициализация OpenGL ES
Android VBO и фоновая загрузка моделей
Android Текстура OpenGL es 2
Редактор 3D-моделей Android
OpenGl ES 2.0 Текстуры Android
Android Opengl es: загрузчик 3D моделей
Android Комбинирование 2D и 3D в OpenGL ES 2.0

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
21.02.2015, 18:03     Opengl es: вывод 3D моделей #2
вершины и фейсы тебе нужны для того что бы вывести фигуру. Посмотри как построен обыкновенный куб.
Возьми создай какой то обьект в редакторе и сохрани(обязательно разбей фигуру на треугольники , opengl es не работает с квадратами ( квадрат простой ты строишь из двух треугольников) )

например фигура с блендера - экспорт в obj -> тебе нужны v и f . подставишь их и у тебя будет фигура на экране.
Yandex
Объявления
21.02.2015, 18:03     Opengl es: вывод 3D моделей
Ответ Создать тему
Опции темы

Текущее время: 11:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru