请问如何用OpenGL绘制两个球体之间的圆柱?

zhghl 2006-02-12 01:41:22
void COpenGLOcxCtrl::drawChannel( GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2 ){

GLfloat dx = abs(x2 - x1);
GLfloat dy = abs(y2 - y1);
GLfloat dz = abs(z2 - z1);
GLfloat distance = sqrt( dx*dx + dy*dy + dz*dz );

GLfloat sinx = dy / sqrt( dy*dy + dz*dz );
GLfloat argx = asin( sinx ) * 180.0f / 3.1415926f;

GLfloat siny = dy / sqrt( dy*dy + dx*dx );
GLfloat argy = asin( siny ) * 180.0f / 3.1415926f;

glPushMatrix();
glTranslatef(x1, y1, z1);
glutSolidSphere(0.001, 12, 12);

GLUquadric * mySphere;
mySphere = gluNewQuadric();
gluQuadricDrawStyle(mySphere, GLU_FILL);
gluQuadricNormals(mySphere, GLU_SMOOTH);

glRotated(argx, 1.0f, 0.0f, 0.0f);
glRotated(argy, 0.0f, 1.0f, 0.0f);
gluCylinder(mySphere, 0.001, 0.001, distance, 6, 1);

glPopMatrix();

glPushMatrix();
glTranslatef(x2, y2, z2);
glutSolidSphere(0.001, 12, 12);
glPopMatrix();
}

上面是我的思路,可是不结果不对,应该怎样实现?谢谢!
...全文
231 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhghl 2006-02-23
  • 打赏
  • 举报
回复
谢谢
寻开心 2006-02-14
  • 打赏
  • 举报
回复
本来就是相同的算法

直接用asin和acos不好,应该用atan2
http://blog.csdn.net/happy__888/archive/2005/04/28/367008.aspx
zhghl 2006-02-14
  • 打赏
  • 举报
回复
http://www.graphics.net.cn/bbs/computer_graphics/0027/030.asp
谢谢,我用上面的方法实现了.
寻开心 2006-02-13
  • 打赏
  • 举报
回复
//出于自己测试方便的目的,把原来的球半径0.001改成了0.1了
void drawChannel( GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2 )
{
// 计算方向向量
GLfloat dx = fabs(x2 - x1);
GLfloat dy = fabs(y2 - y1);
GLfloat dz = fabs(z2 - z1);
GLfloat distance = sqrt( dx*dx + dy*dy + dz*dz );
// 单位化方向向量
GLfloat d1 = 1.0f / distance;
dx = dx * d1;
dy = dy * d1;
dz = dz * d1;
// 做Z和方向向量叉乘后的向量——转轴
GLfloat dxv = -dy;
GLfloat dyv = dx;
GLfloat dzv = 0;
// 计算夹角
GLfloat arg = asin(sqrt(dxv*dxv+dyv*dyv))*180.0f / 3.1415926;

// 绘制第一个球
glPushMatrix();
glTranslatef(x1, y1, z1);
glutSolidSphere(0.1, 12, 12);
glPopMatrix();

// 绘制圆柱
glPushMatrix();
GLUquadric * mySphere;
mySphere = gluNewQuadric();
gluQuadricDrawStyle(mySphere, GLU_FILL);
gluQuadricNormals(mySphere, GLU_SMOOTH);
// 旋转到指定的方向
glRotated(arg, dxv, dyv, dzv);
gluCylinder(mySphere, 0.1, 0.1, distance, 6, 1);
glPopMatrix();
// 绘制第二个球
glPushMatrix();
glTranslatef(x2, y2, z2);
glutSolidSphere(0.1, 12, 12);
glPopMatrix();
};
寻开心 2006-02-13
  • 打赏
  • 举报
回复
1 abs 和 fabs不同
GLfloat dx = abs(x2 - x1);
GLfloat dy = abs(y2 - y1);
GLfloat dz = abs(z2 - z1);
这三个都应该是fabs,否则distance就不对

2 旋转的角度解算不对
从x1,y1,z1, 到 x2,y2,z2的角度计算的不对
应该用叉乘计算出z轴和两点连线之间的法向量,以及他们之间的夹角然后来旋转

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧