Hamid_VB
چهارشنبه 31 تیر 1388, 20:13 عصر
http://tinypic.info/files/yx5t1f7gwt2z5g78ayff.gif
سلام.
من می خوام با OpenGL آب طراحی کنم.
ولی توی کشیدن صفحه ی اصلی که موجای آب باید روش درست شند مشکل دارم.
من این صفحه رو با مثلثای پیوسته کشیدم.
http://tinypic.info/files/obckb7z9xehhsczv22yt.png
من موجایی که از افتادن یه جسم توی آب ساخته میشه رو طراحی کردم ولی موجایی که تصادفی روی سطح دریا ایجاد میشند رو نمتونم طراحی کنم.فکر کنم که فرمول خاصی دارند.
حالا فرمولای ریاضی و فیزیکش یه طرف ، نمی دونم چکار کنم که مثل آب واقعی شکست نور (روی texture) و درخشندگی داشته باشه.(قبلاً Texture_Gen_Q,S,T,R و *glMaterial رو امتحان کردم ولی فایده نداشت)
float rot_step=0,;
void Make_Sea()
{
float i,j;
float dxz,WATERCX,WATERCZ,WATERCY;
for(i = 0;i<=1;i=i+0.01){
rot_step += 0.2;
dxz = powf((powf(WATERCX,2)+powf(WATERCZ,2)),0.5);
WATERCY=(-0.02/dxz)*sin(((rot_step/5)*PI))*sin(((rot_step/5)*PI)+PI);
for(j=0;j<=1;j=j+0.01){
WATERCX=(i/2)*sin((j*2)*PI)+0.5;
WATERCZ=(i/2)*cos((j*2)*PI)+0.5;
water_points_positions_y[int(WATERCX*100)][int(WATERCZ*100)]=WATERCY;
}
}
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
glColor4f(0.4,0.5,0.9,0.8);
glBegin(GL_LINE_STRIP);
for(j=0;j<0.99;j=j+0.01){
for(i=0;i<0.99;i=i+0.01){
glVertex3f(i,water_points_positions_y[int((i)*100)][int((j+0.01)*100)],j+0.01);
glVertex3f(i,water_points_positions_y[int(i*100)][int(j*100)],j);
}
}
glEnd();
glDisable(GL_BLEND|GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
}
سلام.
من می خوام با OpenGL آب طراحی کنم.
ولی توی کشیدن صفحه ی اصلی که موجای آب باید روش درست شند مشکل دارم.
من این صفحه رو با مثلثای پیوسته کشیدم.
http://tinypic.info/files/obckb7z9xehhsczv22yt.png
من موجایی که از افتادن یه جسم توی آب ساخته میشه رو طراحی کردم ولی موجایی که تصادفی روی سطح دریا ایجاد میشند رو نمتونم طراحی کنم.فکر کنم که فرمول خاصی دارند.
حالا فرمولای ریاضی و فیزیکش یه طرف ، نمی دونم چکار کنم که مثل آب واقعی شکست نور (روی texture) و درخشندگی داشته باشه.(قبلاً Texture_Gen_Q,S,T,R و *glMaterial رو امتحان کردم ولی فایده نداشت)
float rot_step=0,;
void Make_Sea()
{
float i,j;
float dxz,WATERCX,WATERCZ,WATERCY;
for(i = 0;i<=1;i=i+0.01){
rot_step += 0.2;
dxz = powf((powf(WATERCX,2)+powf(WATERCZ,2)),0.5);
WATERCY=(-0.02/dxz)*sin(((rot_step/5)*PI))*sin(((rot_step/5)*PI)+PI);
for(j=0;j<=1;j=j+0.01){
WATERCX=(i/2)*sin((j*2)*PI)+0.5;
WATERCZ=(i/2)*cos((j*2)*PI)+0.5;
water_points_positions_y[int(WATERCX*100)][int(WATERCZ*100)]=WATERCY;
}
}
glDepthMask(GL_FALSE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
glColor4f(0.4,0.5,0.9,0.8);
glBegin(GL_LINE_STRIP);
for(j=0;j<0.99;j=j+0.01){
for(i=0;i<0.99;i=i+0.01){
glVertex3f(i,water_points_positions_y[int((i)*100)][int((j+0.01)*100)],j+0.01);
glVertex3f(i,water_points_positions_y[int(i*100)][int(j*100)],j);
}
}
glEnd();
glDisable(GL_BLEND|GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
}