请问如何用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();
}

上面是我的思路,可是不结果不对,应该怎样实现?谢谢!
...全文
224 5 打赏 收藏 转发到动态 举报
写回复
用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轴和两点连线之间的法向量,以及他们之间的夹角然后来旋转
第1章 OpenGL简介 11.1 OpenGL基础 11.1.1 OpenGL图元及命令 11.1.2 OpenGL是一种过程语言 11.1.3 OpenGL的执行模式 21.2 基本OpenGL操作 2第2章 命令和例程概述 42.1 OpenGL处理流程 42.1.1 顶点 42.1.2 ARB绘图子集 82.1.3 片断 92.2 其他OpenGL命令 112.2.1 使用求值器 112.2.2 执行选择和反馈 112.2.3 显示列表的使用 122.2.4 模式和运行的管理 122.2.5 获取状态信息 122.3 OpenGL实用库 132.3.1 生成纹理操作所需的图形 132.3.2 坐标转换 132.3.3 多边形的镶嵌分块 142.3.4 绘制球体圆柱和圆盘 142.3.5 NURBS曲线和曲面 142.3.6 错误处理 152.4 对X窗口系统的OpenGL扩展 152.4.1 初始化 152.4.2 控制绘制操作 15第3章 命令和例程一览 183.1 注释 183.2 OpenGL命令 193.2.1 图元 193.2.2 顶点数组 193.2.3 坐标转换 203.2.4 着色与光照 203.2.5 剪切 213.2.6 光栅化 213.2.7 像素操作 223.2.8 纹理 223.2.9 雾 233.2.10 帧缓冲区操作 243.2.11 求值器 243.2.12 选择与反馈 253.2.13 显示列表 253.2.14 模式与执行 253.2.15 状态查询 263.3 ARB扩展 263.3.1 多重纹理 263.3.2 绘图子集 263.4 GLU例程 283.4.1 纹理图像 283.4.2 坐标转换 293.4.3 多边形镶嵌分块 293.4.4 二次对象 303.4.5 NURBS曲线和曲面 303.4.6 状态查询 313.5 GLX例程 313.5.1 初始化 313.5.2 控制绘图操作 31第4章 定义的常量及相关命令 34第5章 OpenGL参考说明 61第6章 GLU参考说明 368第7章 GLX参考说明 434
译 者 序 近年来,随着计算机技术的进步,我们跨入了一个三维时代,各种扣人心弦的三维游戏、能数字化地显示天气变化的气象服务、震撼人心的3D数字化特殊效果,无不使我们体验到三维世界的全新感觉。可视化、计算机动画、虚拟现实是当今图形学领域的三大热门话题,它们的技术核心都是三维图形。 1992年7月,SGI公司首次发布了作为三维图形编程接口的OpenGL。目前它已成为国际上通用的开放式三维图形标准。一方面,OpenGL规范由ARB(OpenGL Architecture Review Board,OpenGL结构评审委员会)负责管理,充分保证了它的独立性、开放性、前瞻性和跨平台性。它可被集成到Unix、Windows NT 4.0、Windows 98、x窗口等窗口系统中。另一方面,Compaq 、IBM、 Intel、Microsoft等在计算机界具有主导作用的公司纷纷采用OpenGL图形的国际标准。各种游戏加速卡、专用加速部件都能不同程度地提高OpenGL程序的运行性能。这些都推动了OpenGL的发展,并迅速成为三维图形的国际标准。再者,SGI公司不断推出以OpenGL为基础的高级开发工具,以满足对图形工具性能日益增长的需求。这一切使得OpenGL成为最流行的三维图形开发工具。目前它已被广泛应用于CAD/CAM/CAE、地质、航空、医学图像处理、广告、艺术造型、电影后期制作等领域。 OpenGL由大量功能强大的图形函数组成,它集成了所有曲面造型、图形变换、光照、材质、纹理、像素操作、融合、反选择、雾化等复杂的计算机图形学算法。开发人员可以利用这些函数对整个三维图形轻松进行渲染,从而达到数字化现实生活景象的目的。 本书是OpenGL 参考手册的第3版,对OpenGL的函数进行了详细而简洁的说明,是程序员利用OpenGL进行程序开发的不可缺少的工具书。本书第1章是OpenGL入门,第2章对命令和例程进行了简介,第3章集中介绍了各种命令和例程,第4章介绍了定义的常量和相关命令,第5章是OpenGL参考说明,第6章是GLU的参考说明,第7章是GLX的参考说明。 本书在翻译过程中得到了国家863计划项目(863-511-942-016)的支持。参加翻译的人员还有王火亮、许宇荣、杨勤、杨颖、余牛、周贵仔、蒋丽、李岳梅,在此感谢他们的辛勤劳动。 由于计算机软件行业的飞速发展,加之时间仓促,翻译中难免会有不妥之处,如能得到您的及时指正将不胜感激。 我们的电子邮箱地址为caid@cs.zju.edu.cn. 译 者 2000年9月于求是园 目 录 译者序 前言 第1章 OpenGL简介 1 1.1 OpenGL基础 1 1.1.1 OpenGL图元及命令 1 1.1.2 OpenGL是一种过程语言 1 1.1.3 OpenGL的执行模式 2 1.2 基本OpenGL操作 2 第2章 命令和例程概述 4 2.1 OpenGL处理流程 4 2.1.1 顶点 4 2.1.2 ARB绘图子集 8 2.1.3 片断 9 2.2 其他OpenGL命令 11 2.2.1 使用求值器 11 2.2.2 执行选择和反馈 11 2.2.3 显示列表的使用 12 2.2.4 模式和运行的管理 12 2.2.5 获取状态信息 12 2.3 OpenGL实用库 13 2.3.1 生成纹理操作所需的图形 13 2.3.2 坐标转换 13 2.3.3 多边形的镶嵌分块 14 2.3.4 绘制球体圆柱和圆盘 14 2.3.5 NURBS曲线和曲面 14 2.3.6 错误处理 15 2.4 对X窗口系统的OpenGL扩展 15 2.4.1 初始化 15 2.4.2 控制绘制操作 15 第3章 命令和例程一览 18 3.1 注释 18 3.2 OpenGL命令 19 3.2.1 图元 19 3.2.2 顶点数组 19 3.2.3 坐标转换 20 3.2.4 着色与光照 20 3.2.5 剪切 21 3.2.6 光栅化 21 3.2.7 像素操作 22 3.2.8 纹理 22 3.2.9 雾 23 3.2.10 帧缓冲区操作 24 3.2.11 求值器 24 3.2.12 选择与反馈 25 3.2.13 显示列表 25 3.2.14 模式与执行 25 3.2.15 状态查询 26 3.3 ARB扩展 26 3.3.1 多重纹理 26 3.3.2 绘图子集 26 3.4 GLU例程 28 3.4.1 纹

8,305

社区成员

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

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