PDA

View Full Version : سوال: متغیرهای سراسری در opengl



sky.one
پنج شنبه 30 بهمن 1393, 11:12 صبح
من یه متغیر سراسری رو به این شکل double *vr اول برنامه تعریف کردم و تو تابع main آدرس یه آرایه یک بعدی از نوع دابل رو بهش نسبت دادم . توی خود تابع main تمام اعضای آرایه درست و سالم قابل دسترسی ( با cout امتحان کردم ).اما وقتی میخوام توی تابع display در opengl ازش استفاده کنم مثلا به عنوان نقاط یه vertex انگار بعضی از اعضای ارایه از بین میره . نمیدونم مشکل کجاست لطفا راهنمایی کنید.

rahnema1
پنج شنبه 30 بهمن 1393, 12:46 عصر
سلام
لطفا کد را بذارید اینجا

sky.one
پنج شنبه 30 بهمن 1393, 14:25 عصر
#define GLUT_DISABLE_ATEXIT_HACK


#include <windows.h>
#include <GL\glut.h>
#include <iostream>
#include <stdlib.h>
#include <my\pico.h>


using namespace std;


double *lv;
int con;
void draw();
double *lpico();




//LPICO FUNC****
double *lpico(){
int line,lch;
int r=1;
pico p1;
line=p1.countfunc("box.obj" , 'f' , '0');
lch=p1.countfunc("box.obj" , 'f' , 'c');
int t = (line*lch*3)+2;
double lver[t];
lver[0]=line*lch*3;
for (int l=1 ; l!=line+1 ; l++){
for (int lc=1 ; lc!=lch+1 ; lC++‎‎‎‎‎‎‎){
p1.tfile("box.obj" ,l ,lc);
lver[r]=p1.vertex[0]/10;
r+=1;
lver[r]=p1.vertex[1]/10;
r+=1;
lver[r]=p1.vertex[2]/10;
r+=1;
}
}
return lver;
}




//KEYBOARD FUNC****
void keyboard(unsigned char key , int x , int y){
if (key == 27)
exit(0);
if (key == 'w'){
glRotated( 1, 10, 0, 0 );
glutPostRedisplay();}
if (key == 'd'){
glRotated( 1, 0, 10, 0 );
glutPostRedisplay();}
}




//DISP FUNC****
void disp(void){

glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
//draw();
glColor3f(1,1,1);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
//glBegin(GL_POLYGON);
for(int i=1 ; i<=con ; i+=12 ){
glBegin(GL_POLYGON);
glVertex3d(lv[i+0] ,lv[i+1] ,lv[i+2]);
glVertex3d(lv[i+3] ,lv[i+4] ,lv[i+5]);
glVertex3d(lv[i+6] ,lv[i+7] ,lv[i+8]);
glVertex3d(lv[i+9] ,lv[i+10] ,lv[i+11]);
glEnd();
}
glutSwapBuffers();
}


//DRAW FUNC****
void draw(){
glColor3f(1,1,1);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
//glBegin(GL_POLYGON);
for(int i=1 ; i<=con ; i+=12 ){
glBegin(GL_POLYGON);
glVertex3d(lv[i+0] ,lv[i+1] ,lv[i+2]);
glVertex3d(lv[i+3] ,lv[i+4] ,lv[i+5]);
glVertex3d(lv[i+6] ,lv[i+7] ,lv[i+8]);
glVertex3d(lv[i+9] ,lv[i+10] ,lv[i+11]);
glEnd();
}
//glEnd();

}


int main(int argc , char **argv)
{

FreeConsole();
glutInit(&argc , argv);
lv=lpico();//*
con =(int) lv[0];//*
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,400);
glutInitWindowPosition(100,100);
glutCreateWindow("salam");
glutDisplayFunc(disp);
glutKeyboardFunc(keyboard);
glutFullScreen();
glutMainLoop();
return 0;

}








کلا تابع lpico با استفاده از کد هایی که تو هدر فایل pico نوشتم فایل .obj که خروجی مایاست رو باز میکنه و مختصات نقطه هارو میریزه تو یه آرایه و آدرس آرایه رو برمیگردونه . نمیدونم این روش برگردوندن درسته یا نه ولی آرایه ی lv تو تابع main کاملا سالمه ولی تو تابع draw که میخوام ازش استفاده کنم بنظر مشکل داره چون بعضی از نقطه ها نمایش داده نمیشه. راستی من اون دو خط تو تابع main که جلوش //* هست رو گذاشتم تو تابع draw برنامه ظاهرا درست کار کرد ولی سرعتش خیلی کم بود . راستی از dev C++‎ استفاده میکنم.

rahnema1
پنج شنبه 30 بهمن 1393, 14:32 عصر
توی تابع lpico این را تغییر بدید

double* lver =new double[t];

sky.one
پنج شنبه 30 بهمن 1393, 14:44 عصر
مرسی کاملا درست شد. خیلی خیلی ممنون.