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

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

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

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

Q&A

解決済

視野変数の処理方法が分かりません.

OHASI
OHASI

総合スコア90

OpenGL

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

1回答

0グッド

0クリップ

575閲覧

投稿2022/07/14 19:14

質問

視野変換を施す polarview関数に適切な処理を書いて、下の図(図2)のように(距離,仰角,方位
角)= (15.0, 0.0, 30.0)の時の投影図を出力するプログラムを作成したいです.

ちなみに

視野変換(図1)は

  1. 視点からワールド座標系までの距離
  2. 視線と水辺面(xz 面)の間の角度(仰角)
  3. 鉛直軸(y 軸)周りの回転角度(方位角)

で表し、変換式は次式の通りである。

T(0, 0,-距離) Rx(−仰角) Ry (−方位角)

T(・)は平行移動、Rx は x 軸周りの回転、Ry は y 軸周りの回転を表す。

試したこと

初期値を全てマイナスにした.

C言語

1/* グローバル変数 */ 2float hoikaku = 30.0; /*方位角 */ 3float gyokaku = 0.0; /*行革 */ 4float kyori = 15.0; /*距離 */ 5 6void polarview(void) 7{ 8 /* 視野変換の処理 */ ← ここが分かりません 9 hoikaku = -hoikaku; 10 gyokaku = -gyokaku; 11 kyori = -kyori; 12}

図1

イメージ説明

実現したい図(図2)

イメージ説明

下のコードを実行したときの図(図3)

イメージ説明

該当のソースコード

c言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <stdarg.h> 4#include <math.h> 5#define GL_GLEXT_PROTOTYPES 6#ifdef __APPLE__ 7#include <GLUT/glut.h> 8#else 9#include <GL/glut.h> 10#endif 11 12#define SX 600 /*ウインドウの横サイズの初期値*/ 13#define SY 450 /*ウインドウの縦サイズの初期値*/ 14 15/* グローバル変数 */ 16float hoikaku = 30.0; /*方位角 */ 17float gyokaku = 0.0; /*行革 */ 18float kyori = 15.0; /*距離 */ 19 20void polarview(void) 21{ 22 /* 視野変換の処理 */ ← ここが分かりません 23 hoikaku = -hoikaku; 24 gyokaku = -gyokaku; 25 kyori = -kyori; 26} 27 28 29void attribute(float kdr,float kdg,float kdb, float ksr,float ksg,float ksb, float phong) 30{ 31 float kd[4],ks[4],ka[4]; 32 33 kd[0]=kdr; kd[1]=kdg; kd[2]=kdb; kd[3]=1.0; /* kdの設定 */ 34 ks[0]=ksr; ks[1]=ksg; ks[2]=ksb; ks[3]=1.0; /* ksの設定 */ 35 ka[0]=kdr*0.2; ka[1]=kdg*0.2; ka[2]=kdb*0.2; ka[3]=1.0; /* kaの設定 */ 36 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE, kd); /* 拡散反射係数 */ 37 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, ks); /* 鏡面反射係数 */ 38 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT, ka); /* 環境光反射係数 */ 39 glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,phong); /* フォンのモデルの係数 */ 40} 41 42// ---------------------------------------------------------- 43// display() コールバック関数 44// ---------------------------------------------------------- 45void display(void){ 46 47 48 float light[4] ={1.0, 1.0, 1.0, 0.0}; /* 平行光線の指定 */ 49 float intensity[4]={1.0, 1.0, 1.0, 1.0}; /* 光源光の強さ */ 50 float amb[4] ={0.5, 0.5, 0.5, 0.0}; /* 環境光の強さ */ 51 52 glLightfv(GL_LIGHT0,GL_DIFFUSE, intensity); /* 0番の光源に拡散反射の強さを設定 */ 53 glLightfv(GL_LIGHT0,GL_SPECULAR,intensity); /* 0番の光源に鏡面反射の強さを設定 */ 54 glLightfv(GL_LIGHT0,GL_AMBIENT, amb); /* 0番の光源に環境光の強さを設定 */ 55 glLightfv(GL_LIGHT0,GL_POSITION, light); /* 0番の光源に平行光線を設定*/ 56 glEnable(GL_LIGHT0); /* 0番の光源を有効にする */ 57 glEnable(GL_LIGHTING); /* 陰影付けの有効化 */ 58 glEnable(GL_NORMALIZE);/* 法線ベクトルの正規化を有効にする */ 59 glEnable(GL_DEPTH_TEST); /* Zバッファの有効化 */ 60 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*フレームバッファとZバッファのクリア*/ 61 62 glPushMatrix(); 63 64// gluLookAt(0,0.5,15, 0,0.5,0, 0,1,0); /* 視点位置(0,0.5,15),目標点(0,0.5,0)*/ 65 polarview(); 66 67 glShadeModel(GL_FLAT); /* フラットシェーディング */ 68 69 /* 立方体を描画 */ 70 glPushMatrix(); 71 // glColor3f(0.0, 0.5, 0.0); 72 glTranslatef(0, -0.5, 0); /*y方向へ-0.5移動*/ 73 glScalef(3.0, 1.0 , 3.0); /*立方体を前後左右3倍に拡大*/ 74 attribute(0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0); 75 glutSolidCube(1.0); /*立方体*/ 76 glPopMatrix(); 77 78 /* 円錐を描画 */ 79 glPushMatrix(); 80 // glColor3f(1.0, 0.0, 0.0); 81 glRotatef(-90, 1,0,0); /*x軸で90°左回転*/ 82 attribute(1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 128.0); 83 glutSolidCone(1.0, 2.0, 10, 10); /*円錐*/ 84 glPopMatrix(); 85 86 /*トーラスを描画*/ 87 glPushMatrix(); 88 // glColor3f(0.0, 1.0, 1.0); 89 glTranslatef(0, 1, 0); /* y方向へ1移動*/ 90 glRotatef(-90, 1, 0, 0); /*x軸で90°左回転*/ 91 attribute(0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 64.0); 92 glutSolidTorus(0.1, 1.0, 40, 80); /*トーラス*/ 93 glPopMatrix(); 94 95 /* 球体を描画 */ 96 glPushMatrix(); 97 // glColor3f(1.0, 1.0, 0.0); 98 glTranslatef(0, 2, 0); /* y方向へ2移動*/ 99 attribute(0.75,0.75,0.75, 1.0, 1.0, 1.0, 64.0); 100 glutSolidSphere(0.25, 20, 20); /*球体*/ 101 glPopMatrix(); 102 103 glPopMatrix(); 104 105 glDisable(GL_NORMALIZE); 106 glDisable(GL_LIGHT0); 107 glDisable(GL_LIGHTING); 108 glDisable(GL_DEPTH_TEST); 109 glFlush(); 110 111} 112 113 114/* 115** q, Q, ESC キーで終了する 116*/ 117void keyboard(unsigned char key, int x, int y) 118{ 119 switch (key) 120 { 121 case 'q': 122 case 'Q': 123 case '\033': 124 exit(0); 125 default: 126 break; 127 } 128} 129 130void reshape(int sx, int sy) /*リシェープコールバック関数*/ 131{ 132 float aspect = (float)sx/(float)sy; /*アスペクト比*/ 133 134 glViewport(0,0,sx,sy); /*ビューポートの再設定*/ 135 glMatrixMode(GL_PROJECTION); /*投影法計算の準備*/ 136 glLoadIdentity(); /*投影法計算の初期設定*/ 137 gluPerspective(22.5,aspect,1.0,100.0); /*透視投影の設定*/ 138 glMatrixMode(GL_MODELVIEW); /*計算モードを幾何変換に切り替え*/ 139} 140 141int main(int argc, char* argv[]) 142{ 143 glutInit(&argc,argv); /* ①glutの初期化 */ 144 glutInitWindowPosition(0,0); /* ①ウインドウの位置 */ 145 glutInitWindowSize(SX,SY); /* ①ウインドウサイズ */ 146 glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); /*①表示モード*/ 147 glutCreateWindow( argv[0] ); /* ①ウインドウの生成 */ 148 glClearColor (0.0,0.5,1.0,1.0 ); /* ①ウインドウの塗りつぶしの色 */ 149 glutReshapeFunc(reshape); /* リシェープコールバック関数の登録 */ 150 glutKeyboardFunc(keyboard); /* ②キーボード入力コールバック関数の登録 */ 151 glutDisplayFunc(display); /* ②ディスプレイコールバック関数の登録 */ 152 153 glutMainLoop(); /* ③ */ 154 return 0; 155} 156

以上,よろしくお願いいたします.

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

試したこと
初期値を全てマイナスにした.

なぜそうしたのか? そうすることで何を期待したのか?
全く意味がわかりません.

他所で全く用いられていない変数の値をいじくっても動作に何も影響を与えないことは自明ではありませんか?

(マイナスにすることが必要かどうかは知りませんが,とにかく)それらの値を 使いましょうよ.(←これが回答内容)


(もうちょっとだけ踏み込んだ話)

gluLookAt() がコメントアウトされていますが,この関数を使えば所望の処理が達成できるのではないのですか?
であれば,やるべきことは,単に「こいつに,いい感じになる引数値を与えよう!」っていうだけの話でしょう.
そしたら与えましょうよ.

まずこの関数の9つの引数の意味を調べましょうよ.(ググれば一発でしょうし,課題か何かであれば,それ以前に説明されているでしょう)

で,(このような場で質問するよりも前に)少なくともわかるものは与えましょうよ.
9つ(:意味的には3種類)の値のうち,少なくとも3つ(:1種類)はどう見ても自明なのですし.

投稿2022/07/15 02:47

fana

総合スコア10681

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

OHASI

2022/07/15 11:22

ありがとうございました.

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

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