vi三种模式切换武器用一个圆盘切换 具体有什么忘了 是西方背景的 点击屏幕移动 是3D游戏

三种武器用一个圆盘切换 具体有什么忘了 是西方背景的 点击屏幕移动 是3D游戏_百度知道
三种武器用一个圆盘切换 具体有什么忘了 是西方背景的 点击屏幕移动 是3D游戏
我有更好的答案
很高兴为你解答,玩家将可以通过不断的战斗来获得经验提升自己的等级和能力。你所说的游戏可能是《无尽之剑》。《无尽之剑》是Epic Games开发及发行的一款动作类手机游戏,于日发售。游戏的场景为一个全3D的城堡,以及获得更多强力的道具你好
手机游戏第一发布
为您推荐:
其他类似问题
3d游戏的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。南开13春学期《3d游戏软件设计》在线作业
13春学期《3D游戏软件设计》在线作业
试卷总分:100
测试时间:--
、单选题(共 20 道试题,共 40 分。)
在利用矩阵进行图形三维变换时,我们只用3×3矩阵无法完成的变换操作是
D. 以上说法都不对
一束白光照射一个有光泽的蓝色球体,那么这个球体的整体看上去是蓝色的,它上面的亮点则是什么颜色的
在win32程序中,主函数是从哪里进入执行的
B. WinMain
我们在绘制完物体后,如果锁定了深度缓冲区,接着再调换物体的z方向的次序,此时关于遮挡关系以下说法中正确的是
A. AB物体重叠部分会发生混合
B. 遮挡关系发生改变,AB物体遮挡关系互调
C. 遮挡关系不变
D. 无法判断
当我们的源和目标的alpha值都为0.75时,当使用函数glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)进行像素混合,得出的结果描述正确的是
A. 源和目标混合效果相同
B. 混合色更接近源
C. 混合色更接近目标
D. 无法判断
我们使用数组eqn[4]={0,1,0,0}作为参数,利用函数glClipPlane去切割物体时,剩下的部分为原物体的
下列哪个不属于计算机上支持的像素位数
函数void glBlendEquation(Glenum mode)函数中的mode对取值为GL_FUNC_SUBSTRACT描述正确的是
A. CsS+CdD
B. CsS-CdD
C. CdD-CsS
OpenGL中复杂的图形绘制一般都是如何实现的
A. 用曲线模拟
B. 用四边形拼接
C. 用三角形拼接
D. 只要是凸多边形拼接就可以
OpenGL提供的投影矩阵堆栈个数为
利用3×3矩阵进行二维点集变化时,我们使用的矩阵为[1,0,0;0,-1,0;0,0,1],那么变化后的效果为
A. 沿着X轴对称变换
B. 沿着Y轴对称变换
C. 沿着原点对称变换
D. 沿着直线y=x对称变换
两个矢量之间的叉乘结果为
A. 一个矢量
B. 一个标量
C. 如果为零则不是矢量,其它情况下皆为矢量
D. 以上说法都不对
使用函数glDisk(GLUquadric*qobj,Gldouble innerRadius,Gldouble outerRadius,Glint slices,Glint rings)如果要绘制一个没有空的圆盘,我们的参数innerRadius应该如何设置
A. 大小和outerRadius相同
D. 大于outerRadius
现在有控制点为四个,每个顶点有三个坐标,现在我们想利用函数gluNurbsSurface进行NURBS表面设置,那么u_stride的值应该设置为
OpenGL中如何判断一个点接收了光源的多少光线
A. 通过距离光源的距离进行计算
B. 通过法线相对光源的方向进行计算
C. 通过物体的颜色值进行计算
D. 通过物体和光源的颜色值的综合考虑进行计算
一个矢量加上一个矢量结果为
A. 一个矢量
B. 一个标量
C. 如果为零则不是矢量,其它情况下皆为矢量
D. 以上说法都不对
将一条不经过原点的直线进行简单的缩放变换,缩放后直线和原来直线相比
A. 位置变化长度不变
B. 长度变化位置不变
C. 位置和长度都会变化
D. 以上说法都不对
在复合变换中,活动坐标模式的变换,对于坐标变换操作的调用和执行顺序描述中,正确的是
A. 相对于同一个活动坐标系先调用的变换先执行
B. 相对于同一个活动坐标系先调用的变换后执行
C. 相对于同一个活动坐标系调用和执行的顺序没有必然联系
D. 以上说法都不对
OpenGL提供了最大数目为N的模型变换矩阵堆栈,N为
OpenGL中,四种独立的光照模型中哪种光线在环境中经过了充分的散射,无法辨识出它的方向
13春学期《3D游戏软件设计》在线作业
试卷总分:100
测试时间:--
、多选题(共 10 道试题,共 20 分。)
以下是描述glBindTexture函数功能的是
A. 将生成的纹理的名称绑定到指定的纹理上
B. 创建纹理并加载
C. 选择已经加载的纹理进行贴纹理操作
D. 以上都对
我们使用函数glRender(Glenum mode)去启动控制模式,那么以下说法正确的是
A. 可以启动渲染模式
B. 可以启动选择模式
C. 可以启动反馈模式
D. 可以同时启动三种模式
一下那些属于OpenGL的特点
A. 标准支持灵活
B. 具有良好伸缩性
C. 具有良好扩展性
D. 扩展性不强
通过矩阵[sx,0;0,sy]对二维的不经过原点的图元进行缩放变换,有可能得到的结果为
A. 图元相对原点的位置变化了
B. 图元自身尺寸变化了
C. 图元自身发生了旋转
D. 图元可以完全不发生变化
对计算机图形进行显示的方法中可以起到抗锯齿作用的有哪些方法
A. 提高屏幕分辨率
B. 采用区域覆盖法
C. 加权覆盖法
D. 抖动技术
在OpenGL中我们用函数auxDIBImageLoad可以正确导入纹理图片的像素尺寸是
A. 256×256
C. 128×128
D. 100×100
在自动生成纹理坐标的模式中,如果我们想给球体进行环境贴图,那么常用的渲染模式为
A. GL_SPHERE_MAP
B. GL_REFLECTION_MAP
C. GL_TRIANGLES
D. GL_NORMAL_MAP
glVertex3f函数的参数的意义描述正确的有哪些
A. 第一个参数为点的X坐标值
B. 第二个参数为点的Y坐标值
C. 第三个参数为点的Y坐标值
D. 第三个参数为点的W值
在如下哪些模式下,不会产生任何绘图像素,并且屏幕被&冻结&
A. 反馈模式
B. 选择模式
C. 渲染模式
OpenGL允许把与颜色相关的哪三个不同参数和光源相关联
A. GL_AMBIENT
B. GL_DIFFUSE
C. GL_SPECULAR
D. GL_AMBIENT
13春学期《3D游戏软件设计》在线作业
试卷总分:100
测试时间:--
、判断题(共 20 道试题,共 40 分。)
在OpenGL中一次只有一个纹理图像能够处于有效状态
glNormal*函数是glBegin和glEnd之间的合法函数
为了使用mipmap,必须提供全系列的大小为2的整数次方的纹理图像,其范围从2*2到纹理的最大单元
函数glDepthMask的flag参数设置为GL_TRUE,则标志着深度缓冲区可以写入
颜色混合操作在颜色索引模式下是非法的
glRotatef(fRot,0.0f,1.0f,0.0f)函数可以让图形绕着X轴偏转fRot角度
位图是由0和1组成的矩形数组
函数glLoadName用于将当前的名字替换名字堆栈顶部的元素
雾化效果在颜色索引模式下是不可用的
无论是在反馈模式下还是选择模式下,物体的信息总是在任何片断测试之前返回
纹理坐标必须在RGBA模式下才能使用
设置光源位置时,当我们的光源坐标位置(x,y,z,w)中的w为0时代表我们的光为局部光源
函数glPerspective(GLdouble fogy,GLdouble aspect, GLdouble near,GLdouble far)所定义的视体仅限于和X和Y轴对称的平截头体
glDrawPixels函数被调用时,数据首先根据当前生效的像素存储模式从内存进行解包,接着执行像素传输操作。
OpenGL光照模型中,表面的发射颜色可以增加物体的强度,但是他们不受任何光源的影响,在整个场景中,并没有作为一种额外的光照
假设一面砖墙高度只有宽度的2/3,但是只要开启纹理过滤函数glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);然后进行纹理坐标映射就不会出现纹理扭曲
在光栅屏幕中,我们的锯齿效果可以通过各种优化技术完全消除
矩阵[cosA,-sinA;sinA,cosA]实现对二维空间上的图元的的逆时针旋转
过滤函数中的参数GL_NEAREST可以将靠近像素中心的那个纹理单元用于放大和缩小来防止纹理扭曲
glEnable(GL_DEPTH_TEST)函数的作用是开启深度测试
(需要这一门作业答案找客服QQ: 索取就行)
------分隔线----------------------------
------分隔线----------------------------
你还可以阅读以下相关文章 [精华导读]
论文推荐内容
论文热点内容
论文最新发表以前玩的一款游戏黑暗风的弱联网单机手游主角只有一个可以用很多武器双刀镰刀弩之类的轮盘切换武器的_百度知道
以前玩的一款游戏黑暗风的弱联网单机手游主角只有一个可以用很多武器双刀镰刀弩之类的轮盘切换武器的
以前玩的一款游戏黑暗风的弱联网单机手游主角只有一个可以用很多武器双刀镰刀弩之类的轮盘切换武器的每个武器的大招都不一样的主角衣服有点像刺客信条的,游戏背景的话有点像西方的然后是3d游戏效果很好
我有更好的答案
人物不能拖动移动,靠手势切换攻击招式,四个字的名字,国外的游戏,打斗很炫酷对,我正在到处找
采纳率:95%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。3894人阅读
OpenGL(23)
进行图形开发,3D图形数学基础是必不可少,限于其专业性,OpenGL笔记里不做详细赘述。但是对相关术语及其在OpenGL对应的内容还是需要一定的了解。
两个(三分量)单位向量之间的点乘运算将得到一个标量(只有一个值),它表示两个向量之间的夹角。要进行这种运算,这两个向量必须为单位长度,而返回的结果将在-1.0到1.0之间。这个数字实际上就是这两个向量之间夹角的余弦值。
我们可以使用m3dDotProduct3函数来实际获得两个向量之间的点乘结果。
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
m3dGetAngleBetweenVectors3返回这个角的弧度制。
float m3dGetAngleBetweenVectors3 (const M3DVector3f u,const M3DVector3f v);
要进行叉乘,两个向量都不必为单位向量。
两个向量之间叉乘所得的结果是另外一个向量,这个新向量与原来两个向量定义的平面垂直。
m3dCrossProduct3对两个向量进行叉乘并返回运算得到的结果向量。
void m3dCrossproduct3(M3DVector3f result,const M3DVector3f u,const M3DVector3f v);
矩阵是一个二维数组,一个矩阵只有一行或者一列也是合法的。
在我们进行3D程序设计工作时,我们将使用的几乎全部是3X3和4X4矩阵。math3d库中有这两种矩阵数据类型:
typedef float M3DMatrix33f[9];
typedef float M3DMatrix44f[16];
OpenGL变换数据概览
制定观察者或照相机的位置
在场景中移动物体
描述视图和模型变换的二元性
改变视窗体 的大小或重新设置它的形状
这是一种伪变换,只是对窗口上的最终输出进行缩放
制定观察者或照相机的位置
在场景中移动物体
描述视图和模型变换的二元性
改变视窗体 的大小或重新设置它的形状
这是一种伪变换,只是对窗口上的最终输出进行缩放
笛卡尔坐标系:从观察者的角度来看,x轴和y轴的正方向分别指向右方和上方。z轴的正方向从原点指向使用者,而z轴的负方向则从观察者指向屏幕内部。
当我们利用OpenGL进行3D绘制时,就会使用笛卡尔坐标系。如果不进行任何变换,那么使用的坐标系将与刚刚描述的视觉坐标系相同。
视图变换允许我们把观察点放在所希望的任何位置,并允许在任何方向上观察场景。确定视图变换就像在场景中放置照相机并让它指向某个方向。
模型变换用于操纵模型和其中的特定对象。这些变换将对象移动到需要的位置,然后再对它们进行旋转和缩放。
投影变换将在模型视图变换之后应用到顶点上,它将指定一个完成的场景(所有模型变换都已完成)是如何投影到屏幕上的最终图像。
正投影:所有多边形都是精确地按照指定的相对大小来在屏幕上绘制的。
透视投影:透视投影的特点是透视缩短,这种特性使得远处的物体看起来比进出同样大小的物体更小一些。
当所有变换完成后,就得到了一个场景的二维投影,它将被映射到屏幕上某处的窗口上。这种到物理创口标的映射是我们最后要做的变换,称为视口变换。
模型视图矩阵
模型视图矩阵是一个4X4矩阵,它表示一个变换后的坐标系,我们可以用来放置对象和确定对象的方向。一个包含单个顶点数据的矩阵乘以模型视图矩阵后得到新的视觉坐标。
OpenGL并不是将一个4X4矩阵表示为一个浮点值的二维数组,而是将它表示为一个由16个浮点值组成的单个数组。
前三纵列分别对应x轴,y轴,z轴上的方向。
如果有一个包含一个不同坐标系的位置和方向的4X4矩阵,然后用一个表示原来坐标系的向量(表示为一个列矩阵或向量)乘以这个矩阵,得到的结果是一个转换到新坐标系下的新向量。这就意味着,空间中任意位置和任何想要的方向都可以由一个4X4矩阵唯一确定,并且如果用一个对象的所有向量乘以这个矩阵,那么我们就将整个对象变换到了空间中的给定位置和方向。
单位矩阵中除了对角线上的一组元素之外,其他元素均为0。将一个向量乘以一个单位矩阵,就相当于用这个向量乘以1,不会发生任何改变。
我们可以调用math3d库中的m3dTranslationMatrix44函数来使用变换矩阵。
void m3dTranslationMatrix44(M3DMatrix44f m,float x,float y,float z);
m3dRotationMatrix44(M3DMatrix44f m,float angle,float x,float y,float z);
这个函数让我们围绕一个由x、y和z变量指定的向量来进行旋转。旋转的角度沿逆时针方向按照弧度计算,由变量angle指定。
下面的代码创建一个旋转矩阵,可以使顶点沿着任意由(1,1,1)指定的轴旋转45度:
m3dRotationMatrix(m3dDegToRad(45.0),1.0f,1.0f,1.0f);
宏m3dDegToRad将角度值转换为弧度制。
void m3dScaleMatrix44(M3DMatrix44f m,float xScale,float yScale,float zScale);
math3d库函数m3dMatrixMultiply44用来将两个矩阵相乘并返回运算结果。
void m3dMatrixMultiply44(M3DMatrix44f product,const M3DMatrix44f a,const M3DMatrix44f b);
运用模型视图矩阵
void RenderScene(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
M3DMatrix44f mFinalTransform, mTranslationMatrix, mRotationM
m3dTranslationMatrix44(mTranslationMatrix, xPos, yPos, 0.0f);
static float yRot = 0.0f;
yRot += 5.0f;
m3dRotationMatrix44(mRotationMatrix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f);
m3dMatrixMultiply44(mFinalTransform, mTranslationMatrix, mRotationMatrix);
shaderManager.UseStockShader(GLT_SHADER_FLAT, mFinalTransform, vRed);
squareBatch.Draw();
glutSwapBuffers();
Orthographic(正交)和Perspective(透视)
我们可以使用math3d库或GLFrustum类来创建一个正投影矩阵
GLFrustum::SetOrthographic(GLfloat xMin,GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax);
GLFrustum::SetPerspective(float fFov,float fAspect,float fNear,float fFar);
使用矩阵堆栈
GLMatrixStack类的构造函数允许指定堆栈的最大深度,默认的堆栈深度为64.这个矩阵堆栈在初始化时已经在堆栈中包含了单位矩阵。
GLMatrixStack::GLMatrixStack(int iStackDepth=64);
我们可以通过调用在顶部载入这个单位矩阵。
void GLMatrixStack(void);
或者可以在堆栈顶部载入任何矩阵。
void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);
此外,我们可以用一个矩阵乘以矩阵堆栈的顶部矩阵,相乘得到的结果随后将存储在堆栈的顶部。
void GLMatrixStack::MultMatrix(const M3DMatrix44f);
最后,只要用GetMatrix函数就可以获得矩阵堆栈顶部的值,这个函数可以进行两次重载,以适应GLShaderManager的使用,或者仅仅是获得顶部矩阵的副本。
const M3DMatrix44f& GLMatrixStack(void);
void GLMatrixStack(M3DMatrix44f mMatrix);
压栈与出栈
void GLMatrixStack(void);
void PushMatrix(const M3DMatrix44f mMatrix);
void PushMatrix(GLFrame& frame);
void GLMatrixStack(void);
GLMatrixStack类也内建了对创建旋转、平移和缩放矩阵的支持。相应的函数列出如下:
void MatrixStack(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);
void MatrixStack(GLfloat x,GLfloat y,GLfloat z);
void MatrixStack(GLfloat x,GLfloat y,GLfloat z);
void ChangeSize(int nWidth, int nHeight)
glViewport(0, 0, nWidth, nHeight);
viewFrustum.SetPerspective(35.0f, float(nWidth)/float(nHeight), 1.0f, 100.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
void RenderScene(void)
static GLfloat vFloorColor[] = { 0.0f, 1.0f, 0.0f, 1.0f};
static GLfloat vTorusColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
static CStopWatch
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
modelViewMatrix.PushMatrix();
shaderManager.UseStockShader(GLT_SHADER_FLAT,
transformPipeline.GetModelViewProjectionMatrix(),
vFloorColor);
floorBatch.Draw();
modelViewMatrix.Translate(0.0f, 0.0f, -2.5f);
modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(),
vTorusColor);
torusBatch.Draw();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
使用照相机和角色进行移动
照相机管理
3D环境中典型的渲染循环流程
保存单位矩阵
应用照相机变换
绘制不会移动的物体
绘制移动的物体(角色)
绘制角色几何图形
应用角色变换
应用照相机变换
恢复照相机变换
恢复单位矩阵
GLFrame函数用来检索条件适合的照相机矩阵:
void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly=false);
将一个固定光源位置变换到视觉坐标在每个成精中只需进行一次:
M3DVector4f vLightPos={0.0f,10.0f,5.0f,1.0f};
M3DVector4f VLightEyeP
m3dTransformVector4(vLightEyePos,vLightPos,mCamera);
例如要渲染一个蓝色球体:
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipeline.GetModelViewMatrix(),transformPipeline,GetProjectionMatrix(),vLightEyePos,vSphereColor)
三角形批次类
首先,我们需要为对象创建一个事件。
GLTriangleBatch myCoolO
然后通知容器最多打算使用的顶点数,开始创建网格。
myCoolObject.BeginMesh(200);
接着来添加三角形,AddTriangle成员函数接受一个包含3个顶点的数组,一个包含3个法线的数组,以及一个包含3个纹理坐标的数组。
void GLTriangleBatch::AddTrangle(M3DVector3f verts[3],M3DVector3f vNorms[3],M3DVector2f vTexCoords[3]);
当我们添加完三角形时,调用End。
myCoolObject.End();
最后,调用Draw函数。
myCoolObject.Draw();
gltMakeSphere函数引用一个三角形批次、求的半径和组成球体的片段及其堆叠数量:
void gltMakeSphere(GLTriangleBatch& sphereBatch,GLfloat fRadius,Glint iSlices,Glint iStacks);
void gltMakeTorus(GLTriangleBatch& torusBatch,GLfloat majorRadius,GLfloat minorRadius,Glint numMajor,Glint numMinor);
圆柱或圆锥
void gltMakeCylinder(GLTriangleBatch& cylinderBatch,GLfloat baseRadius,GLfloat topRadius,GLfloat fLength,Glint numSlices,Glint numStacks);
void gltMakeDisk(GLTriangleBatch& diskBatch,GLfloat innerRadius,GLfloat outerRadius,Glint nSlices,Glint nStacks);
转载请注明出处:
#include "stdafx.h"
#include &GLTools.h&
#include &GLShaderManager.h&
#include &GLFrustum.h&
#include &GLBatch.h&
#include &GLFrame.h&
#include &GLMatrixStack.h&
#include &GLGeometryTransform.h&
#include &StopWatch.h&
#include &math.h&
#include &stdio.h&
#include &math.h&
#define GLUT_DISABLE_ATEXIT_HACK
#include &GLUT.H&
#if _MSC_VER&=1900
#include "stdio.h"
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus
extern "C"
FILE* __cdecl __iob_func(unsigned i) {
return __acrt_iob_func(i);
#endif /* _MSC_VER&=1900 */
#define NUM_SPHERES 50
GLFrame disk[NUM_SPHERES/2];
GLFrame cylinder[NUM_SPHERES/2];
GLShaderManager
GLMatrixStack
modelViewM
GLMatrixStack
projectionM
GLGeometryTransform transformP
GLTriangleBatch
GLTriangleBatch
GLTriangleBatch
GLTriangleBatch
GLTriangleBatch
void SetupRC()
shaderManager.InitializeStockShaders();
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 30);
gltMakeSphere(sphereBatch, 0.3f, 26, 13);
gltMakeCylinder(cylinderBatch, 0.2f, 0.2f, 0.5f, 13, 2);
gltMakeDisk(diskBatch, 0.2f, 0.4f, 13, 3);
floorBatch.Begin(GL_LINES, 324);
for (GLfloat x = -20.0; x &= 20.0f; x += 0.5) {
floorBatch.Vertex3f(x, -0.55f, 20.0f);
floorBatch.Vertex3f(x, -0.55f, -20.0f);
floorBatch.Vertex3f(20.0f, -0.55f, x);
floorBatch.Vertex3f(-20.0f, -0.55f, x);
floorBatch.End();
for (int i = 0; i & NUM_SPHERES; i++) {
GLfloat x = ((GLfloat)((rand() % 400) - 200) * 0.1f);
GLfloat z = ((GLfloat)((rand() % 400) - 200) * 0.1f);
if(i%2==0)
disk[i/2].SetOrigin(x, 0.0f, z);
cylinder[(i-1)/2].SetOrigin(x, 0.0f, z);
GLfloat vetts[3][3];
GLfloat vNorms[3][3];
GLfloat vTexCoords[3][2];
GLfloat angle = 0;
for (int i = 0; i & 3; i++) {
angle += M3D_2PI / 6.0f;
vetts[i][0] = float(-5 + i*0.2);
vetts[i][1] = float(sin(float(angle)));
vetts[i][2] = float(cos(float(angle)));
vNorms[i][0] = float(-5 + i*0.2);
vNorms[i][1] = float(cos(float(angle)));
vNorms[i][2] = float(sin(float(angle)));
vTexCoords[i][0] = float(-5 + i*0.2);
vTexCoords[i][1] = float(sin(float(angle)));
triangleBatch.BeginMesh(3);
triangleBatch.AddTriangle(vetts, vNorms, vTexCoords);
triangleBatch.End();
void ChangeSize(int nWidth, int nHeight)
glViewport(0, 0, nWidth, nHeight);
viewFrustum.SetPerspective(35.0f, float(nWidth) / float(nHeight), 1.0f, 100.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
void RenderScene(void)
static GLfloat vFloorColor[] = { 0.0f, 1.0f, 0.0f, 1.0f };
static GLfloat vTorusColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
static GLfloat vSphereColor[] = { 0.0f, 0.0f, 1.0f, 1.0f };
static GLfloat vdiskColor[] = { 0.0f, 0.5f, 0.5f, 1.0f };
static GLfloat vcylinderColor[] = { 0.5f, 0.0f, 0.5f, 1.0f };
static CStopWatch
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
modelViewMatrix.PushMatrix();
M3DMatrix44f mC
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.PushMatrix(mCamera);
M3DVector4f vLightPos = { 0.0f, 10.0f, 5.0f, 1.0f };
M3DVector4f vLightEyeP
m3dTransformVector4(vLightEyePos, vLightPos, mCamera);
shaderManager.UseStockShader(GLT_SHADER_FLAT,
transformPipeline.GetModelViewProjectionMatrix(),
vFloorColor);
floorBatch.Draw();
for (int i = 0; i & NUM_SPHERES; i++) {
modelViewMatrix.PushMatrix();
if (i % 2 == 0) {
modelViewMatrix.MultMatrix(disk[i / 2]);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightEyePos, vdiskColor);
diskBatch.Draw();
modelViewMatrix.MultMatrix(cylinder[(i - 1) / 2]);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightEyePos, vcylinderColor);
cylinderBatch.Draw();
modelViewMatrix.PopMatrix();
modelViewMatrix.Translate(0.0f, 0.0f, -2.5f);
modelViewMatrix.PushMatrix();
modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightEyePos, vTorusColor);
torusBatch.Draw();
modelViewMatrix.PopMatrix();
modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightEyePos, vTorusColor);
triangleBatch.Draw();
modelViewMatrix.Rotate(yRot * -2.0f, 0.0f, 1.0f, 0.0f);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightEyePos, vSphereColor);
sphereBatch.Draw();
modelViewMatrix.PopMatrix();
modelViewMatrix.PopMatrix();
glutSwapBuffers();
glutPostRedisplay();
void SpecialKeys(int key, int x, int y)
float linear = 0.1f;
float angular = float(m3dDegToRad(5.0f));
if (key == GLUT_KEY_UP)
cameraFrame.MoveForward(linear);
if (key == GLUT_KEY_DOWN)
cameraFrame.MoveForward(-linear);
if (key == GLUT_KEY_LEFT)
cameraFrame.RotateWorld(angular, 0.0f, 1.0f, 0.0f);
if (key == GLUT_KEY_RIGHT)
cameraFrame.RotateWorld(-angular, 0.0f, 1.0f, 0.0f);
int main(int argc, char* argv[])
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL SphereWorld");
glutSpecialFunc(SpecialKeys);
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
SetupRC();
glutMainLoop();
按方向键可以移动和旋转画面,可以看到三角形,小球围绕花圈转动,花圈自己在自旋转。
访问:59945次
积分:1110
排名:千里之外
原创:40篇
评论:14条
(5)(4)(5)(4)(4)(4)(5)(4)(5)(4)(5)

我要回帖

更多关于 系统切换的三种方式 的文章

 

随机推荐