エラー修正お願いします。
Posted: 2011年10月28日(金) 22:48
初心者なので、サンプルコードに新しい関数を自分で入れるとどうしてもエラーが出てしまいます。
今後、エラーが出ないように出来るコツも教えてほしいです。
OpenGLで、仮想三次元を作って、マウスで視点の向きを変えたいのです。
あと、カーソルキーで視点の場所を平行移動出来る関数もついでに入れてほしいです。
(43) : error C2664: 'glutMotionFunc' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__cdecl *)(int,int)' に変換できません。
(44) : error C2664: 'glutMouseFunc' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__cdecl *)(int,int,int,int)' に変換できません。
(89) : error C2660: 'PolarCoordinatesLookAt' : 関数に 6 個の引数を指定できません。
#include <GL/glut.h>
#define _USE_MATH_DEFINES
#include "math.h"
//----------------------------------------------------
// 変数の宣言
//----------------------------------------------------
int WindowPositionX = 200; //生成するウィンドウ位置のX座標
int WindowPositionY = 200; //生成するウィンドウ位置のY座標
int WindowWidth = 512; //生成するウィンドウの幅
int WindowHeight = 512; //生成するウィンドウの高さ
char WindowTitle[] = "世界の始まり"; //ウィンドウのタイトル
int mouseFlag = GL_FALSE;
int mouseXStart;
int mouseYStart;
double mouseXAngle = 0.0;
double mouseYAngle = 0.4*M_PI;
double mouseXDis =5.0;
//----------------------------------------------------
// 関数プロトタイプ(後に呼び出す関数名と引数の宣言)
//----------------------------------------------------
void Initialize(void); //初期設定時に呼び出す関数
void Idle(void); //アイドル時に呼び出す関数
void Display(void); //画面描画時に呼び出す関数
void Ground(void); //大地の描画用の関数
void PolarCoordinatesLookAt(void);
void myMouseMotion(void);
void myMouseFunc(void);
//----------------------------------------------------
// メイン関数
//----------------------------------------------------
int main(int argc, char *argv[]){
glutInit(&argc, argv); //環境の初期化
glutInitWindowPosition(WindowPositionX, WindowPositionY); //ウィンドウの位置の指定
glutInitWindowSize(WindowWidth, WindowHeight); //ウィンドウサイズの指定
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); //ディスプレイモードの指定
glutCreateWindow(WindowTitle); //ウィンドウの作成
glutIdleFunc(Idle); //プログラムアイドル状態時に呼び出される関数
glutDisplayFunc(Display); //描画時に呼び出される関数を指定する(関数名:Display)
Initialize(); //初期設定の関数を呼び出す
glutMotionFunc(myMouseMotion);
glutMouseFunc(myMouseFunc);
glutMainLoop();
return 0;
}
void PolarCoordinatesLookAt(void){
double r, theta, phi, cx, cy, cz, x, y, z;
//球座標から直交座標に変換
x = r*sin(phi)*cos(theta) + cx;
y = r*sin(phi)*sin(theta) + cy;
z = r*cos(phi) + cz;
//z軸が上方向
gluLookAt(x, y, z, cx, cy, cz, 0.0, 0.0, 1.0);
}
//----------------------------------------------------
// 初期設定の関数
//----------------------------------------------------
void Initialize(void){
glClearColor(1.0, 1.0, 1.0, 0.0); //背景色
glEnable(GL_DEPTH_TEST);//デプスバッファを使用:glutInitDisplayMode() でGLUT_DEPTH を指定する
//透視変換行列の設定------------------------------
glMatrixMode(GL_PROJECTION);//行列モードの設定(GL_PROJECTION : 透視変換行列の設定、GL_MODELVIEW:モデルビュー変換行列)
glLoadIdentity();//行列の初期化
gluPerspective(30.0, (double)WindowWidth/(double)WindowHeight, 0.1, 1000.0); //透視投影法の視体積gluPerspactive(th, w/h, near, far);
//------------------------------------------------
}
//----------------------------------------------------
// アイドル時に呼び出される関数
//----------------------------------------------------
void Idle(){
glutPostRedisplay(); //glutDisplayFunc()を1回実行する
}
//----------------------------------------------------
// 描画の関数
//----------------------------------------------------
void Display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //バッファの消去
//モデルビュー変換行列の設定--------------------------
glMatrixMode(GL_MODELVIEW);//行列モードの設定(GL_PROJECTION : 透視変換行列の設定、GL_MODELVIEW:モデルビュー変換行列)
glLoadIdentity();//行列の初期化
glViewport(0, 0, WindowWidth, WindowHeight);
PolarCoordinatesLookAt(mouseXDis, mouseXAngle, mouseYAngle, 0.0, 0.0, 0.0);
//----------------------------------------------
Ground();
glutSwapBuffers(); //glutInitDisplayMode(GLUT_DOUBLE)でダブルバッファリングを利用可
}
//----------------------------------------------------
// 大地の描画
//----------------------------------------------------
void Ground(void) {
double ground_max_x = 300.0;
double ground_max_y = 300.0;
glColor3d(0.8, 0.8, 0.8); // 大地の色
glBegin(GL_LINES);
for(double ly = -ground_max_y ;ly <= ground_max_y; ly+=20.0){
glVertex3d(-ground_max_x, ly,0);
glVertex3d(ground_max_x, ly,0);
}
for(double lx = -ground_max_x ;lx <= ground_max_x; lx+=20.0){
glVertex3d(lx, ground_max_y,0);
glVertex3d(lx, -ground_max_y,0);
}
glEnd();
}
void myMouseMotion(void){
int x, y, xdis, ydis;
switch(mouseFlag){
case 0x100: //GLUT_LEFT_BUTTON
xdis = x - mouseXStart;
ydis = y - mouseYStart;
mouseXAngle -= (double)xdis * 0.002;
mouseYAngle -= (double)ydis * 0.002;
break;
case 0x001: //GLUT_RIGHT_BUTTON
xdis = x - mouseXStart;
mouseXDis += (double)xdis * 0.002;
break;
}
mouseXStart = x;
mouseYStart = y;
}
void myMouseFunc(void){
int button, state, x, y;
if(state == GLUT_DOWN ){
switch(button){
case GLUT_LEFT_BUTTON:
mouseXStart = x;
mouseYStart = y;
mouseFlag = 0x100;
break;
case GLUT_RIGHT_BUTTON:
mouseXStart = x;
mouseYStart = y;
mouseFlag = 0x001;
break;
default:
break;
}
}else{
mouseFlag = 0x000;
}
}
今後、エラーが出ないように出来るコツも教えてほしいです。
OpenGLで、仮想三次元を作って、マウスで視点の向きを変えたいのです。
あと、カーソルキーで視点の場所を平行移動出来る関数もついでに入れてほしいです。
(43) : error C2664: 'glutMotionFunc' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__cdecl *)(int,int)' に変換できません。
(44) : error C2664: 'glutMouseFunc' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__cdecl *)(int,int,int,int)' に変換できません。
(89) : error C2660: 'PolarCoordinatesLookAt' : 関数に 6 個の引数を指定できません。
#include <GL/glut.h>
#define _USE_MATH_DEFINES
#include "math.h"
//----------------------------------------------------
// 変数の宣言
//----------------------------------------------------
int WindowPositionX = 200; //生成するウィンドウ位置のX座標
int WindowPositionY = 200; //生成するウィンドウ位置のY座標
int WindowWidth = 512; //生成するウィンドウの幅
int WindowHeight = 512; //生成するウィンドウの高さ
char WindowTitle[] = "世界の始まり"; //ウィンドウのタイトル
int mouseFlag = GL_FALSE;
int mouseXStart;
int mouseYStart;
double mouseXAngle = 0.0;
double mouseYAngle = 0.4*M_PI;
double mouseXDis =5.0;
//----------------------------------------------------
// 関数プロトタイプ(後に呼び出す関数名と引数の宣言)
//----------------------------------------------------
void Initialize(void); //初期設定時に呼び出す関数
void Idle(void); //アイドル時に呼び出す関数
void Display(void); //画面描画時に呼び出す関数
void Ground(void); //大地の描画用の関数
void PolarCoordinatesLookAt(void);
void myMouseMotion(void);
void myMouseFunc(void);
//----------------------------------------------------
// メイン関数
//----------------------------------------------------
int main(int argc, char *argv[]){
glutInit(&argc, argv); //環境の初期化
glutInitWindowPosition(WindowPositionX, WindowPositionY); //ウィンドウの位置の指定
glutInitWindowSize(WindowWidth, WindowHeight); //ウィンドウサイズの指定
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); //ディスプレイモードの指定
glutCreateWindow(WindowTitle); //ウィンドウの作成
glutIdleFunc(Idle); //プログラムアイドル状態時に呼び出される関数
glutDisplayFunc(Display); //描画時に呼び出される関数を指定する(関数名:Display)
Initialize(); //初期設定の関数を呼び出す
glutMotionFunc(myMouseMotion);
glutMouseFunc(myMouseFunc);
glutMainLoop();
return 0;
}
void PolarCoordinatesLookAt(void){
double r, theta, phi, cx, cy, cz, x, y, z;
//球座標から直交座標に変換
x = r*sin(phi)*cos(theta) + cx;
y = r*sin(phi)*sin(theta) + cy;
z = r*cos(phi) + cz;
//z軸が上方向
gluLookAt(x, y, z, cx, cy, cz, 0.0, 0.0, 1.0);
}
//----------------------------------------------------
// 初期設定の関数
//----------------------------------------------------
void Initialize(void){
glClearColor(1.0, 1.0, 1.0, 0.0); //背景色
glEnable(GL_DEPTH_TEST);//デプスバッファを使用:glutInitDisplayMode() でGLUT_DEPTH を指定する
//透視変換行列の設定------------------------------
glMatrixMode(GL_PROJECTION);//行列モードの設定(GL_PROJECTION : 透視変換行列の設定、GL_MODELVIEW:モデルビュー変換行列)
glLoadIdentity();//行列の初期化
gluPerspective(30.0, (double)WindowWidth/(double)WindowHeight, 0.1, 1000.0); //透視投影法の視体積gluPerspactive(th, w/h, near, far);
//------------------------------------------------
}
//----------------------------------------------------
// アイドル時に呼び出される関数
//----------------------------------------------------
void Idle(){
glutPostRedisplay(); //glutDisplayFunc()を1回実行する
}
//----------------------------------------------------
// 描画の関数
//----------------------------------------------------
void Display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //バッファの消去
//モデルビュー変換行列の設定--------------------------
glMatrixMode(GL_MODELVIEW);//行列モードの設定(GL_PROJECTION : 透視変換行列の設定、GL_MODELVIEW:モデルビュー変換行列)
glLoadIdentity();//行列の初期化
glViewport(0, 0, WindowWidth, WindowHeight);
PolarCoordinatesLookAt(mouseXDis, mouseXAngle, mouseYAngle, 0.0, 0.0, 0.0);
//----------------------------------------------
Ground();
glutSwapBuffers(); //glutInitDisplayMode(GLUT_DOUBLE)でダブルバッファリングを利用可
}
//----------------------------------------------------
// 大地の描画
//----------------------------------------------------
void Ground(void) {
double ground_max_x = 300.0;
double ground_max_y = 300.0;
glColor3d(0.8, 0.8, 0.8); // 大地の色
glBegin(GL_LINES);
for(double ly = -ground_max_y ;ly <= ground_max_y; ly+=20.0){
glVertex3d(-ground_max_x, ly,0);
glVertex3d(ground_max_x, ly,0);
}
for(double lx = -ground_max_x ;lx <= ground_max_x; lx+=20.0){
glVertex3d(lx, ground_max_y,0);
glVertex3d(lx, -ground_max_y,0);
}
glEnd();
}
void myMouseMotion(void){
int x, y, xdis, ydis;
switch(mouseFlag){
case 0x100: //GLUT_LEFT_BUTTON
xdis = x - mouseXStart;
ydis = y - mouseYStart;
mouseXAngle -= (double)xdis * 0.002;
mouseYAngle -= (double)ydis * 0.002;
break;
case 0x001: //GLUT_RIGHT_BUTTON
xdis = x - mouseXStart;
mouseXDis += (double)xdis * 0.002;
break;
}
mouseXStart = x;
mouseYStart = y;
}
void myMouseFunc(void){
int button, state, x, y;
if(state == GLUT_DOWN ){
switch(button){
case GLUT_LEFT_BUTTON:
mouseXStart = x;
mouseYStart = y;
mouseFlag = 0x100;
break;
case GLUT_RIGHT_BUTTON:
mouseXStart = x;
mouseYStart = y;
mouseFlag = 0x001;
break;
default:
break;
}
}else{
mouseFlag = 0x000;
}
}