任意の画像のテクスチャマッピング

こちらのサイトにある方法では、任意の画像を読み込み、球体にテクスチャマッピングして回すということをしています。
私もこの方法でテクスチャマッピングしたいと考えています。
3D空間にオブジェクトを配置する方法までは分かったのですが、それに対してテクスチャマッピングをする方法が分かりません。
分かる方がおりましたら教えていただきたいです。

5 Comments

Atsushi Ueno
Atsushi Ueno on 13 Jul 2021
PTB3を導入してMinimalisticOpenGLDemoを動かし、やっと質問の背景を理解しました。
C:\toolbox\Psychtoolbox\PsychDemos\OpenGL4MatlabDemos (パスの頭が違うかもしれません)
の中にソースコードが読める状態で入っています。なぜテクスチャマッピングをする方法が分からないのでしょうか?何かを実行して意図した通りに動かない等の問題が起きているのでしょうか?
本当にOpenGL,GLU,GLUTの関数が動く環境が整っているので、OpenGL関連の書籍やWebに載っている内容も殆どそのまま動かせるとおもいます。書籍と言えば昔から「赤本」と言われるガイドブックが有名です。
Atsushi Ueno
Atsushi Ueno on 13 Jul 2021
Screen()という関数が何やら色んな事をやっていて、この関数の役割も良く理解する必要がありそうですね。これが「MATLABでOpenGLが動く為の窓口的な役割」を担っているようです。Screen()の中身はMEXファイルでソースは読めませんでした。
テクスチャに使う画像(メモリ)のサイズは2の累乗のサイズでなければ動作しない(もしくは意図しない動作になる)問題があるそうです。私の記憶からは完全に無くなっていました。(CGと言えば)GPUを動かす時も「機械的に動く物にデータを合わせないと上手く動かない」と言う事は非常に良くありますね(それしかないかも)。
akasa
akasa on 14 Jul 2021
ご回答ありがとうございます。
現在
glTranslatef(-7.5, 2, -50);
glMaterialfv(GL.FRONT_AND_BACK,GL.AMBIENT, [ 1 0.0 0.0 ]);
glMaterialfv(GL.FRONT_AND_BACK,GL.DIFFUSE, [ 1.0 0.0 0.0 ]);
glutSolidCube(3.05);
glTranslatef(7.5, -2, 50);
この位置に赤い立方体を置いており、
function cubeface( i, tx )
% We want to access OpenGL constants. They are defined in the global
% variable GL. GLU constants and AGL constants are also available in the
% variables GLU and AGL...
global GL
% Vector v maps indices to 3D positions of the corners of a face:
v=[ 0 0 0 ; 1 0 0 ; 1 1 0 ; 0 1 0 ; 0 0 1 ; 1 0 1 ; 1 1 1 ; 0 1 1 ]'-0.5;
% Compute surface normal vector. Needed for proper lighting calculation:
n=cross(v(:,i(2))-v(:,i(1)),v(:,i(3))-v(:,i(2)));
% Bind (Select) texture 'tx' for drawing:
glBindTexture(GL.TEXTURE_2D,tx);
% Begin drawing of a new quad:
glBegin(GL.QUADS);
% Assign n as normal vector for this polygons surface normal:
glNormal3f(n(1), n(2), n(3));
x_1=7.5;
y_1=-2;
z_1=50;
k_1=3.05;
% Define vertex 1 by assigning a texture coordinate and a 3D position:
glTexCoord2f(0, 0);
glVertex3f(x_1,y_1,z_1);
% Define vertex 2 by assigning a texture coordinate and a 3D position:
glTexCoord2f(1, 0);
glVertex3f(x_1,y_1-k_1,z_1);
% Define vertex 3 by assigning a texture coordinate and a 3D position:
glTexCoord2f(1, 1);
glVertex3f(x_1,y_1-k_1,z_1-k_1);
% Define vertex 4 by assigning a texture coordinate and a 3D position:
glTexCoord2f(0, 1);
glVertex3f(x_1,y_1,z_1-k_1);
% Done with this polygon:
glEnd;
% Return to main function:
return
こうしているのですが、できないという状態です。
エラーなどは出ないので、座標が間違っているのかと思います。
Atsushi Ueno
Atsushi Ueno on 14 Jul 2021
Edited: Atsushi Ueno on 14 Jul 2021
私もPTB3のデモを動かしたりしてみましたが、OpenGLプログラムを調べるのも時間が掛かりそうで、即答は無理そうです。お役に立てず申し訳ございません。
最初に"global GL"ってのがある以外はOpenGLプログラムと同じですね。MATLABのデータ型を使っているので感動しています。光の反射とか計算するのに「面の法線ベクトル」を定義するんですよね。
既にプリミティブの表示でお分かりかもしれませんが、プログラムが問題無く動作しても、最終的にフレームバッファ(メモリ)の内容が正しく指定され値が書き込まなければ、初期化されたままの状態(真っ黒)を表示するだけになってしまいます。また、テクスチャ特有のメモリ構造もあり、問題の追跡は更に複雑です。
既に質問内容が完全にOpenGLになっているので、いっその事OpenGLフォーラムに顔を出してみるのはどうでしょうか。当然OpenGL関連の知識を持つMATLABユーザの方もいるかもしれませんが、回答の確率を考えると断然OpenGLというかCGの専門家に問うべきでしょう。
一方OpenGLフォーラムに「MATLABでOpenGL関数を直接叩いてCGを動かす人」は滅多にいないでしょう。なので注意すべき点は「MALTABでOpenGLを動かす事と、OpenGLの機能を動かす事を明確に切り分ける」事です。
akasa
akasa on 16 Jul 2021
ご回答ありがとうございます。
OpenGLのフォーラムで質問してみます。
いろいろなアドバイスありがとうございました。

Sign in to comment.

Answers (0)

Products

Release

R2021a

Asked:

on 12 Jul 2021

Commented:

on 16 Jul 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!