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

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

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

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

Q&A

0回答

593閲覧

ベジェ曲面の表示を行いたい

txty

総合スコア302

OpenGL

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

0グッド

0クリップ

投稿2024/10/29 03:23

編集2024/11/03 10:15

実現したいこと

ベジェ曲面の制御点のコントロールで、正しい引数を指定したい。

発生している問題・分からないこと

GLfloat ControlPoints[4][4][3] を制御点として自分で与えましたが、後のコードは本のコードと同じにしています。書籍はITテキストコンピュータグラフィックス著者 魏 大名 先田和弘 R.Durikovic 向井信彦 C.Vilbrandt となっています。
(ITテキストという同じタイトルの本があるようなので。)
p.165の
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1,12, 4, &ControlPoints[0][0][0]);のパラメータが特にわからなくて教えてほしいです。
ControlPoints[4][4][3]がなかったので自分で書き、残りのコードのパラメータは本と一緒にしました。なので、ControlPointsとglMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1,12, 4, &ControlPoints[0][0][0]);のパラメータに行き違いがあるかもしれません。

glMapGrid2f(8, 0.0, 1.0,8, 0.0, 1.0); 
glEvalMesh2(GL_LINE, 0, 8, 0, 8);はグリッドのようでしたがよくわかりません。。

該当のソースコード

copilotでコードの順番を整理してもらいました。

opengl

1#include <GL/glut.h> 2 3GLfloat ControlPoints[4][4][3] = { 4 5 {{0.0 , 0.0 , 0.0}, {0 , 1.0*50, 0}, {0, 2.0*50, 0}, {0.0 , 3.0*50, 0.0}}, 6 {{1.0*50 , 0, 0}, {1.0*50,1.0*50 ,0}, {1.0*50, 2.0*50 ,0}, {1.0*50,3.0*50,0}}, 7 {{2.0*50, 0,0}, {2.0*50,1.0*50,0}, {2.0*50, 2.0*50, 0}, {2.0*50, 3.0*50, 0}}, 8 {{3.0*50,0,0}, {3.0*50, 1.0*50, 0}, {3.0*50,2.0*50,0,}, {3.0*50, 3.0*50, 0}} 9}; 10 11 12//openglってz軸、奥方向が小さくて、手前にいくほどzの+が大きくなるんだっけ? 13gluLookAt( 14 150*2,150*2,150*2, // カメラの位置 (eyex, eyey, eyez) 15 0, 0, 50, // 注視点の位置 (centerx, centery, centerz) 16 0.0, 1.0, 0.0 // アップベクトル (upx, upy, upz) 17 ); 18 19//正しいと思われるものと差し替えました。間違えてるかもしれないので自分で考えてください。 20copilotに教えてもらったものに、合わせたつもりです。&ControlPoints[0][0][0]の読んでいく順番がわかりませんが、変形もしてないので自分で調整してください。 21i,j,k(x,y,z)はまもったつもりです。まちがえてる場所を教えてくれると嬉しいです。あと、底面にできなかった。 22 23 24void display() { 25 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 26 27 glMatrixMode(GL_PROJECTION); 28 glLoadIdentity(); 29 gluPerspective(45.0, 1.0, 1.0, 1000.0); 30 31 glMatrixMode(GL_MODELVIEW); 32 glLoadIdentity(); 33 gluLookAt(30.0, 30.0, 400.0, 34 30.0, 30.0, 0.0, 35 0.0, 1.0, 0.0); 36 37 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1,12, 4, &ControlPoints[0][0][0]); 38 39 glEnable(GL_MAP2_VERTEX_3); 40 41 glEnable(GL_AUTO_NORMAL); 42 43 44 glMapGrid2f(8, 0.0, 1.0,8, 0.0, 1.0); 45   46glEvalMesh2(GL_LINE, 0, 8, 0, 8);//本ではここの位置ではありませんでしたが、ここの位置でも問題ありませんでした。 47 48 glFlush(); 49}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

コードを実行し、思いどおりに表示できましたが、パラメータが正しく指定し、1回の入力で済ませたい。結果、パラメータをうまく入力できていない。 また、自分で入力したControlPoints[4][4][3]を切りのいい値にすればよかったと思いました。

補足

opengl

1本にサンプルはないといいましたがp166にサンプルコードがありました。GLfloat ControlPoints[4][4][3] = { 2 {{0.0 , 0.0 , 150.0}, {50 , 50, 150}, {100, 50, 150}, {150.0 ,0, 150.0}},{{0.0 , 50, 100}, {50,70 ,100}, 3 {100, 70 ,100}, {150,50,100}}, 4 {{0.0, 50,50}, {50,70,50}, {100, 70, 50}, {150, 50,50}}, 5 {{0,0,0}, {50, 50, 0}, {100,50,0,}, {150,0, 0}} 6}; 7x軸に、0 50 100 150 でz軸は150 100 50 0 でy軸は何かの合成なのかな。わからないでした。解説したい方がいましたら、お願いします。

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

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

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

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

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

txty

2024/11/06 11:19 編集

わかりやすい気がしたので、 https://www.cs.shinshu-u.ac.jp/~maruyama/graphics/ogl-glut/bezier.html  のサイト様を参考文献とさせていただきますが、 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1,12, 4, &ControlPoints[0][0][0]); 0がuvの最小値で、最大値がuv上じゃ1になる? でQ00 Q01 Q02 Q 03で、m=3,かn= 3だから?、どちらがどっちなのか確かめてません。なぜ3なのかも自信ないです。同様に、?m+1,n+1で4、Q00 Q10 Q20 Q30 から単純に4をいれるわけじゃないことだけわかる。(5かもしれないし6かもしれないので)本によると、バーンスタイン基底関数を用い図8.5(m=3 n=3の場合)に示す(m+1)(n+1)個の制御点Qijにより生成されるベジェ曲面パッチp(u,v)はとあるのでm=3n=3のベジェ曲面の場合はいいと思いました ustrideは、(pointsで指定されたポインタを辿っていったときに) PijとPi+1 jの間にあるfloatの数(個数)を指定 し、vstrideは PijとPi j+1の間にあるfloatの数(個数)を指定し ている?  。 後、制御点底面にすればよかった
txty

2024/10/30 20:38 編集

埒があかないので、copilot使った。ctrlpointsは4x4の制御点配列で、各制御点が3つの座標 (x, y, z) を持ちます。この場合、次の制御点までの間に12個の浮動小数点値があることになります。これは、各制御点が3つの座標を持ち、4つの制御点がv方向に並んでいるためです。(vは縦だった,) 具体的には、次のようにメモリ上に配置されます: ctrlpoints[0][0][0], ctrlpoints[0][0][1], ctrlpoints[0][0][2], // 1つ目の制御点 (x, y, z) ctrlpoints[0][1][0], ctrlpoints[0][1][1], ctrlpoints[0][1][2], // 2つ目の制御点 (x, y, z) ctrlpoints[0][2][0], ctrlpoints[0][2][1], ctrlpoints[0][2][2], // 3つ目の制御点 (x, y, z) ctrlpoints[0][3][0], ctrlpoints[0][3][1], ctrlpoints[0][3][2], // 4つ目の制御点 (x, y, z) このように、各制御点が3つの浮動小数点値を持ち、4つの制御点が並んでいるため、次の制御点までの間に12個の浮動小数点値があることになります。 この場合、次の制御点までの間という表現以外は納得。 ustride P_{ij}は制御点ctrlpoints[i][j]を指し、P_{(i+1)j}は制御点ctrlpoints[i+1][j]を指します。この場合、P_{ij}からP_{(i+1)j}までの間にある浮動小数点数の数は、各制御点が3つの座標 (x, y, z) を持つため、3個になります。 (i=横 j=縦 だから 1個移動したらx,y,zの3個ってことですか。間違えてたらすいません。) したがって、ustrideは3になります。これは、次の制御点までの間に3個の浮動小数点値があることを意味します。 具体的なメモリ配置は次のようになります: ctrlpoints[i][j][0], ctrlpoints[i][j][1], ctrlpoints[i][j][2], // P_{ij} (x, y, z) ctrlpoints[i+1][j][0], ctrlpoints[i+1][j][1], ctrlpoints[i+1][j][2], // P_{(i+1)j} (x, y, z) このように、P_{ij}からP_{(i+1)j}までの間に3個の浮動小数点値があるため、ustrideは3になります vsrideの12が分からなくなりました。 (Σの縦がvstride、Σの横がustrideででなのでしょうか。と入力)Σの横がustrideは違うと思う。1個しか動かなくて、合計じゃない。格子点の問題じゃないですよね。3と12が欲しいだけです。(ustrideが1個移動するとvstrideが4個移動するみたいな。と入力) 理解が深まってきましたね。ustrideとvstrideの関係についてもう少し詳しく説明します。 ustrideが1個移動すると、u方向(横方向)に1つの制御点分移動します。これは、次の制御点までの間に3つの浮動小数点値(x, y, z)があることを意味します。 一方、vstrideが4個移動すると、v方向(縦方向)に1つの制御点分移動します。これは、次の制御点までの間に12個の浮動小数点値があることを意味します。具体的には、各制御点が3つの座標 (x, y, z) を持ち、4つの制御点が並んでいるためです。 具体的な例として、次のような4x4の制御点配列があるとします: GLfloat ctrlpoints[4][4][3]; ここで、各制御点は3つの座標 (x, y, z) を持ちます。 ustrideが1個移動すると、次の制御点までの間に3つの浮動小数点値があります。 vstrideが4個移動すると、次の制御点までの間に12個の浮動小数点値があります。 このように、ustrideとvstrideはそれぞれの方向における制御点間の間隔を示しています。 control pointaは何も確認せずに入力してしまいましたので、後で目を通しますが、メモリの知識があまりないので、できないかもしれません。 疲れたから読んでない。あってるかよくわからないから参考にしないでくれ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問