質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

933閲覧

Openglで描画したポリゴンをカメラの方向へ回転させたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2018/10/02 01:46

編集2018/10/02 09:40

前提・実現したいこと

Android (kotlin) でopengl (GLES20) を使用したアプリを作成しようとしています。
XYZ空間内に平面のポリゴンを描画するところまではできましたが、
描画したポリゴンをカメラの方へ向かせる方法がわかりません。

現在、ポリゴンはXY平面に対して平行に描画されていますが、
ポリゴンをカメラからの視線に対して直角になるように回転させたいです。

よろしくお願いいたします。

現在の画面

イメージ説明

該当のソースコード

MainActivity.kt

kotlin

1import android.support.v7.app.AppCompatActivity 2import android.os.Bundle 3import [project package uri].view.SampleGLSurfaceView 4 5class MainActivity : AppCompatActivity() { 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 9 setContentView(SampleGLSurfaceView(this)) 10 } 11}

view.SampleGLSurfaceView.kt

kotlin

1import android.content.Context 2import android.opengl.GLSurfaceView 3import android.util.AttributeSet 4 5class SampleGLSurfaceView(context: Context, attrs: AttributeSet?) : GLSurfaceView(context, attrs) { 6 constructor(context: Context): this(context, null) { 7 setEGLContextClientVersion(2) 8 setRenderer(SampleGLSurfaceViewRenderer()) 9 renderMode = RENDERMODE_CONTINUOUSLY 10 } 11}

view.SampleGLSurfaceViewRenderer.kt

kotlin

1import android.opengl.GLES20 2import android.opengl.GLSurfaceView 3import android.opengl.Matrix 4import [project package uri].data.SampleGLData 5import javax.microedition.khronos.egl.EGLConfig 6import javax.microedition.khronos.opengles.GL10 7 8class SampleGLSurfaceViewRenderer() : GLSurfaceView.Renderer { 9 var vertexShader: Int = -1 10 var fragmentShader: Int = -1 11 var shaderProgram: Int = -1 12 13 var attributeHandlers: MutableMap<String, Int> = mutableMapOf() 14 var uniformHandlers: MutableMap<String, Int> = mutableMapOf() 15 16 var sampleData: SampleGLData = SampleGLData() 17 18 var modelMatrix: FloatArray = FloatArray(16) 19 var viewMatrix: FloatArray = FloatArray(16) 20 var perspectiveMatrix: FloatArray = FloatArray(16) 21 22 var aspect: Float = 0.0f 23 24 override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) { 25 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) 26 27 initShadersAndProgram() 28 29 initLocationHandlers() 30 } 31 32 override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) { 33 GLES20.glViewport(0, 0, width, height) 34 35 aspect = width * 1.0f / height 36 } 37 38 override fun onDrawFrame(gl: GL10?) { 39 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT or GLES20.GL_DEPTH_BUFFER_BIT) 40 GLES20.glEnable(GLES20.GL_DEPTH_TEST) 41 42 GLES20.glUseProgram(shaderProgram) 43 44 attributeHandlers["position"]?.also { positionHandle -> 45 GLES20.glEnableVertexAttribArray(positionHandle) 46 47 GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 12, sampleData.vertexBuffer) 48 49 resetMvpMatrix() 50 applyMvpMatrix() 51 52 GLES20.glDrawElements(GLES20.GL_TRIANGLES, sampleData.indicesBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, sampleData.indicesBuffer) 53 54 resetMvpMatrix() 55 Matrix.translateM(modelMatrix, 0, 0.0f, -4.0f, 0.0f) 56 applyMvpMatrix() 57 58 GLES20.glDrawElements(GLES20.GL_TRIANGLES, sampleData.indicesBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, sampleData.indicesBuffer) 59 60 GLES20.glDisableVertexAttribArray(positionHandle) 61 } 62 } 63 64 private fun applyMvpMatrix() { 65 uniformHandlers["mvpMatrix"]?.also { mvpMatrixHandler -> 66 val mvpMatrix: FloatArray = FloatArray(16) 67 Matrix.multiplyMM(mvpMatrix, 0, perspectiveMatrix, 0, viewMatrix, 0) 68 Matrix.multiplyMM(mvpMatrix, 0, mvpMatrix, 0, modelMatrix, 0) 69 70 GLES20.glUniformMatrix4fv(mvpMatrixHandler, 1, false, mvpMatrix, 0) 71 } 72 } 73 74 private fun resetMvpMatrix() { 75 Matrix.setIdentityM(modelMatrix, 0) 76 77 Matrix.setLookAtM(viewMatrix, 0, 78 0.0f, 0.4f, -1.0f, 79 0.0f, 0.0f, 0.0f, 80 0.0f, 1.0f, 0.0f) 81 82 Matrix.perspectiveM(perspectiveMatrix, 0, 83 120.0f, 84 aspect, 85 0.1f, 10.0f) 86 } 87 88 private fun initLocationHandlers() { 89 attributeHandlers.put("position", GLES20.glGetAttribLocation(shaderProgram, "position")) 90 91 uniformHandlers.put("mvpMatrix", GLES20.glGetUniformLocation(shaderProgram, "mvpMatrix")) 92 } 93 94 private fun initShadersAndProgram() { 95 val vertexShaderSource = """ 96 attribute vec3 position; 97 uniform mat4 mvpMatrix; 98 void main(void) { 99 gl_Position = mvpMatrix * vec4(position, 1.0); 100 } 101 """.trimIndent() 102 103 val fragmentShaderSource = """ 104 precision mediump float; 105 void main(void) { 106 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 107 } 108 """.trimIndent() 109 110 vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER) 111 GLES20.glShaderSource(vertexShader, vertexShaderSource) 112 GLES20.glCompileShader(vertexShader) 113 114 fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER) 115 GLES20.glShaderSource(fragmentShader, fragmentShaderSource) 116 GLES20.glCompileShader(fragmentShader) 117 118 shaderProgram = GLES20.glCreateProgram() 119 GLES20.glAttachShader(shaderProgram, vertexShader) 120 GLES20.glAttachShader(shaderProgram, fragmentShader) 121 GLES20.glLinkProgram(shaderProgram) 122 } 123}

data.SampleGLData.kt

kotlin

1import java.nio.ByteBuffer 2import java.nio.ByteOrder 3import java.nio.FloatBuffer 4import java.nio.ShortBuffer 5 6class SampleGLData { 7 var vertexCoords: Int = 4 8 val vertexArray: FloatArray 9 val vertexBuffer: FloatBuffer 10 val indicesArray: ShortArray 11 val indicesBuffer: ShortBuffer 12 13 init { 14 vertexArray = floatArrayOf( 15 -1.0f, 1.0f, 1.0f, 16 -1.0f, -1.0f, 1.0f, 17 1.0f, -1.0f, 1.0f, 18 1.0f, 1.0f, 1.0f 19 ) 20 21 vertexBuffer = createFloatBuffer(vertexArray) 22 23 indicesArray = shortArrayOf( 24 0, 1, 2, 25 0, 2, 3 26 ) 27 28 indicesBuffer = createShortBuffer(indicesArray) 29 } 30 31 fun createFloatBuffer(array: FloatArray): FloatBuffer { 32 return ByteBuffer.allocateDirect(array.size * 4).run { 33 order(ByteOrder.nativeOrder()) 34 asFloatBuffer().apply { 35 put(array) 36 position(0) 37 } 38 } 39 } 40 41 fun createShortBuffer(array: ShortArray): ShortBuffer { 42 return ByteBuffer.allocateDirect(array.size * 2).run { 43 order(ByteOrder.nativeOrder()) 44 asShortBuffer().apply { 45 put(array) 46 position(0) 47 } 48 } 49 } 50}

tiitoiさん(2018/10/02 16:58)への回答

質問がわかりにくくてすみません。

ポリゴンをカメラからの視線に対して直角に設定するパラメータがわからない

ポリゴンをカメラからの視線に対して直角に設定する方法(メソッド、もしくは一連の処理)がわかりません。
全てのポリゴンがカメラの方向を向くように(四角形を正面で捉えた時に画面上に正方形として描画されるように)したいです。
ポリゴンを操作することになるのでおそらくモデル行列に対して変換を行うのだろうと予想してはいるのですが、今の所うまくいっていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2018/10/02 07:58

質問のコードにあるようにビュー行列のパラメータを設定するだけだと思うのですが、ポリゴンをカメラからの視線に対して直角に設定するパラメータがわからないという質問でしょうか?
退会済みユーザー

退会済みユーザー

2018/10/02 09:41

ご質問ありがとうございます。質問本文追記しましたのでご確認いただけると幸いです。
guest

回答1

0

ベストアンサー

Android の開発環境はないので具体的なコードは示せないのですが、OpneGL やカメラ行列についてコメントします。

オブジェクトの見る方向はビュー行列で定義されます。

質問のコードの以下の部分です。

//カメラの向きを作成 Matrix.setLookAtM(viewMatrix, 0, 0.0f, 0.4f, -1.0f, //カメラ位置 0.0f, 0.0f, 0.0f, //カメラの向き 0.0f, 1.0f, 0.0f) // カメラの上方向

カメラの位置が (0.0f, 0.4f, -1.0f) となっているので、Y軸方向に 0.4、z 軸方向に -1.0 の位置にカメラがあり、原点 (0, 0, 0) を見ている状態です。透視射影なので、画像で示されているような見え方になります。

例えば、このカメラの位置を (0, 0, 2) に設置すれば、原点に対して直線上に並ぶので正方形に見えるようになるのではないでしょうか。

イメージ説明

引用元

OpenGL の座標系は次のようになることに注意してください。

イメージ説明

思い通りの見え方にしたい場合、まずビュー行列について勉強されるといいと思います。

検索用キーワード

  • 「OpenGL lookat」
  • 「OpenGL ビュー行列」
  • 「OpenGL カメラ」

参考リンク

投稿2018/10/02 17:00

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問