実現したいこと
ここに実現したいことを箇条書きで書いてください。
objファイルを読み込んで、3Dビューで描画されるようにしたい
前提
ここに質問の内容を詳しく書いてください。
明滅を無くして3Dオブジェクトを描画、視点操作をできるようにするにはどこを直せばよろしいでしょうか
描画されない原因だけでも知りたいです、、
発生している問題・エラーメッセージ
ウィンドウを展開し、その中でobjファイルを取り込む部分まではできてると思うのですが、
(デバッグをしてもエラーは出なかったので)
画面が青→黒と明滅するだけで何も表示されません。
青になるのはglClearColorで値を青になるようにしてるのでわかるのですが
何も描画されないので手詰まりです、、
キー操作も入力後コンソールに文字を出力できたのでなので押していれば視点変更で何か映るはずなのですがずっと明滅してるだけです
エラーメッセージ
該当のソースコード
Java
OpenGL(LWJGL)
ソースコード import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import org.lwjgl.assimp.AIFace; import org.lwjgl.assimp.AIMesh; import org.lwjgl.assimp.AIScene; import org.lwjgl.assimp.AIVector3D; import org.lwjgl.assimp.Assimp; import org.lwjgl.glfw.GLFWKeyCallback; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLUtil; import org.lwjgl.system.MemoryUtil; public class Game3D { private long window; private float rotationX = 45.0f; private float rotationY = 45.0f; private GLFWKeyCallback KeyCallback; public void run() { init(); loop(); //glfwFreeCallbacks(window); glfwDestroyWindow(window); glfwTerminate(); cleanup(); glfwSetErrorCallback(null).free(); } private void init() { if (!glfwInit()) { throw new IllegalStateException("Unable to initialize GLFW"); } glfwDefaultWindowHints(); glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); window = glfwCreateWindow(800, 600, "Simple 3D Game", MemoryUtil.NULL, MemoryUtil.NULL); if (window == MemoryUtil.NULL) { throw new RuntimeException("Failed to create the GLFW window"); } glfwSetKeyCallback(window, KeyCallback = new GLFWKeyCallback() { @Override public void invoke(long window, int key, int scancode, int action, int mods) { if (action == GLFW_PRESS) { switch (key) { case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(window, true); break; case GLFW_KEY_W: rotationX += 5.0f; System.out.println("wが押された"); break; case GLFW_KEY_S: rotationX -= 5.0f; break; case GLFW_KEY_A: rotationY += 5.0f; break; case GLFW_KEY_D: rotationY -= 5.0f; break; } } } }); GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor()); glfwSetWindowPos(window, (vidMode.width() - 800) / 2, (vidMode.height() - 600) / 2); glfwMakeContextCurrent(window); glfwSwapInterval(1); glfwShowWindow(window); GL.createCapabilities(); glEnable(GL_DEPTH_TEST); GLUtil.setupDebugMessageCallback(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthFunc(GL_LEQUAL); } private void loop() { glClearColor(0.0f, 0.0f, 5.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //描画内容の初期化 while (!glfwWindowShouldClose(window)) { glfwPollEvents(); render(); glfwSwapBuffers(window); } cleanup(); } private void render() { glRotatef(rotationX, 1.0f, 0.0f, 0.0f); glRotatef(rotationY, 0.0f, 1.0f, 0.0f); AIScene obj = Assimp.aiImportFile("ここにファイルパス", 1); for (int i = 0; i < obj.mNumMeshes(); i++) { AIMesh mesh = AIMesh.create(obj.mMeshes().get(i)); renderMesh(mesh); } glfwSwapBuffers(window); glfwPollEvents(); Assimp.aiReleaseImport(obj); } private void cleanup() { KeyCallback.free(); } private void renderMesh(AIMesh mesh) { System.out.println("Rendering mesh with " + mesh.mNumFaces() + "faces."); glBegin(GL_TRIANGLES); for (int i = 0; i < mesh.mNumFaces(); i++) { AIFace face = mesh.mFaces().get(i); for ( int j = 0; j < face.mNumIndices(); j++) { int index = face.mIndices().get(j); AIVector3D vertex = mesh.mVertices().get(index); glVertex3f(vertex.x(), vertex.y(), vertex.z()); } } glEnd(); } public static void main(String[] args) { new Game3D().run(); } }
試したこと
・初期視点部分の値(rotationX,rotationYの部分)を変更しましたが変わらず明滅するだけでした。
・キー操作を受け取ったらその内容をコンソールに出力する、を試しました。
表示されたのでキー操作の認識はできてると思います
・上と同じ方法で、objの頂点メッシュの値もコンソールに出力されました。(renderMeshメソッド内のSystem.outの部分です)
・loopメソッド内のglfwPollEvents(); render(); glfwSwapBuffers(window);の順番をそれぞれ入れ替えましたが変わりませんでした。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/12/15 18:02