计算机图形学实验-实验七 三维立方体的旋转
3维移动立方体原理
![3维移动立方体原理](https://img.taocdn.com/s3/m/8f2e257e366baf1ffc4ffe4733687e21ae45ff78.png)
3维移动立方体原理
移动立方体的原理涉及到三维空间中的几何变换和坐标系转换。
当我们谈论立方体的移动时,我们通常是指在三维空间中对立方体
进行平移、旋转或缩放等操作。
这些操作都可以通过数学和物理原
理来解释。
首先,让我们来看平移。
平移是指在三维空间中沿着某个方向
移动物体,这可以通过改变物体的坐标来实现。
假设我们有一个立
方体,它的每个顶点都有一个三维坐标(x, y, z)。
如果我们想将立
方体沿着x、y和z轴分别移动一个距离dx、dy和dz,我们只需将
每个顶点的坐标分别加上这些距离即可实现平移。
其次,旋转是另一种常见的立方体移动操作。
旋转可以围绕某
个轴进行,比如绕x、y或z轴。
在数学上,我们可以使用旋转矩阵
来描述这种变换。
通过乘以旋转矩阵,立方体的每个顶点的坐标都
会发生变化,从而实现旋转操作。
最后,缩放是指改变立方体的尺寸。
这可以通过改变立方体顶
点的坐标,并相应地调整其边长来实现。
缩放操作也可以用矩阵来
表示,通过矩阵乘法将立方体的顶点坐标进行相应的缩放。
需要注意的是,以上所述的操作都是在数学模型层面上进行描述的。
在实际的计算机图形学或游戏开发中,立方体的移动往往是通过矩阵变换来实现的,这涉及到了图形学和线性代数的知识。
总的来说,移动立方体的原理涉及到了数学、物理和计算机图形学等多个领域的知识。
通过合理的数学描述和变换操作,我们可以实现对立方体的平移、旋转和缩放等操作。
画立方体——计算机图形学实验
![画立方体——计算机图形学实验](https://img.taocdn.com/s3/m/986599d276eeaeaad1f3309c.png)
// Attributes
public:
CMy6_DrawcubeDoc* GetDocument();
bool draw;
void drawCube();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
// CMy6_DrawcubeView construction/destruction
CMy6_DrawcubeView::CMy6_DrawcubeView()
{
// TODO: add construction code here
draw=true;
}
CMy6_DrawcubeView::~CMy6_DrawcubeView()
{0,20,0},{30,20,0},{30,20,15},{0,20,15},
{0,0,0},{30,0,0},{30,0,15},{0,0,15}};
int Edge[12][2]={
{0,1},{1,2},{2,3},{3,0},
{4,5},{5,6},{6,7},{7,4},
{0,4},{1,5},{2,6},{3,7}};
// CMy6_DrawcubeView message handlers
void CMy6_DrawcubeView::Ondrawcube()
{
// TODO: Add your command handler code here
BOOL CMy6_DrawcubeView::OnPreparePrinting(CPrintInfo* pInfo)
计算机图形学实验-实验七--三维立方体的旋转
![计算机图形学实验-实验七--三维立方体的旋转](https://img.taocdn.com/s3/m/01bb78df28ea81c758f5784f.png)
贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转
实
验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150
实
验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。
绘制一个三维立方体。
实验原理Java3D
在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:。
计算机图形学课件 第7章 三维变换及三维观察 电子教案[可修改版ppt]
![计算机图形学课件 第7章 三维变换及三维观察 电子教案[可修改版ppt]](https://img.taocdn.com/s3/m/b1a2ae9f852458fb760b5642.png)
y X
(2)绕x轴旋转
1 0
0 0
TRX
0 0
cos sin
sin cos
0 0
z
0 0
0 1
y X
(3)绕y轴旋转
cos 0 sin 0
TR Y
0
sin
1 0
0
cos
0 0
z
0
0
0
1
y
X
4. 对称变换 (1)关于坐标平面对称 关于xoy平面进行对称变换的矩阵计算形式为:
1 0 0 0
TFxy
输出设备上的图形
7.2 三维几何变换
a b c p
p'x'
y'
z'
1pT3Dx
y
z
1d
h
e i
f j
q r
l m n s
7.2.1 三维基本几何变换
三维基本几何变换都是相对于坐标原点和坐标轴 进行的几何变换 假 设 三 维 形 体 变 换 前 一 点 为 p(x,y,z), 变 换 后 为 p'(x',y',z')。
1. 平移变换
1 0 0 0
Tt
0 0
1 0
0
0
1 0
Tx
Ty
Tz
1
Z (x,y,z) (x',y',z')
Y
X
图 7-5 平 移 变 换
2. 比例变换
(1)局部比例变换
a 0 0 0
Ts
0
0
e 0
0 j
0
0
0
0
0
1
例子:对如图7-6所示的长方形体进行比例变换,其中 a=1/2,e=1/3,j=1/2,求变换后的长方形体各点坐标。
计算机图形学 第七章 三维变换及三维观察
![计算机图形学 第七章 三维变换及三维观察](https://img.taocdn.com/s3/m/6f231a79f46527d3240ce0de.png)
33
平行投影
C A B A′
投影平面
投影面A′B′C ′在XOY面上 AA′ ⊥ 面A′B′C ′
⎡1 ⎢0 ⎢ ⎢0 ⎢ ⎣0 0 0 0⎤ 1 0 0⎥ ⎥ 0 0 0⎥ ⎥ 0 0 1⎦
34
C′ B′
Chapter 7三维变换及三维观察
平行投影
Z
A C A′
Chapter 7三维变换及三维观察
⎛a⎞ α = tg ⎜ ⎟ ⎝b⎠
−1
⎛ c ⎞ β = cos ⎜ ⎟ a 2 + b2 + c2 ⎠ ⎝
−1
24
对称变换
关于面对称:
XOY平面 YOZ平面 ZOX平面
P ′ ( x′ P(x y z) y′ z′)
关于线对称:
X轴 Y轴 Z轴
关于点对称:
原点
根据数学意义进行求 解; 按几何意义进行求 解;
1 * A = A A
−1
26
Chapter 7三维变换及三维观察
逆变换
平移的逆变换 比例的逆变换 整体比例的逆变换 旋转的逆变换
⎡ 1 ⎢ 0 ⎢ ⎢ 0 ⎢ ⎢ −Tx ⎣
0 1 0 −Ty
0 0 1 −Tz
0⎤ 0⎥ ⎥ 0⎥ ⎥ 1⎥ ⎦
0 0⎤ 0 0⎥ ⎥ 1 0⎥ ⎥ 0 1⎦
Y O X
Chapter 7三维变换及三维观察
11
Y
旋转变换:绕Z轴
P′
θ
Z
P
X
⎡ cos θ ⎢ − sin θ ⎢ ⎢ 0 ⎣
⎡ cos θ ⎢ − sin θ ⎢ ⎢ 0 ⎢ ⎣ 0
sin θ cos θ 0
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/c9f3f1ff18e8b8f67c1cfad6195f312b3169ebdb.png)
计算机图形学实验报告计算机图形学课程综合实验题⽬:WebGL实现正⽅体的3D旋转作者分⼯:单独完成签名:时间:2018年1⽉16⽇⼀、实验⽬的掌握WebGL的三维图形绘制⽅法⼆、实验要求结合相关的图形学知识,使⽤WebGL编程实现在浏览器显⽰⼀个3D的正⽅体,并可通过⿏标操作控制此正⽅体的旋转;利⽤纹理知识为正⽅体的各个⾯贴上图⽚。
实验完成后要求根据⾃⼰的成果撰写⼀份实验报告。
三、实现原理实现⿏标控制⽴⽅体的旋转需要监听⿏标的移动时间,在⿏标按下左键时记录⿏标此时的坐作为初始坐标,然后在⿏标移动时⽤当前坐标减去初始坐标,获得⿏标的位移,根据这个位移计算旋转矩阵,从⽽旋转⽴⽅体。
具体实现细节如下:1、⾸先需要设置两个着⾊器:a.顶点着⾊器的作⽤是保存图形的顶点信息(如位置,颜⾊等),具体代码如下,本程序使⽤模型视图投影矩阵变换顶点坐标,并通过v_TexCoord向⽚元着⾊器提供纹理坐标⽤于映射纹理。
绘制⼀个顶点需要调⽤⼀次。
图1 顶点着⾊器程序b.⽚元着⾊器:⽚元相当于像素,此着⾊器通过gl_FragColor指定颜⾊,可以对相应的区域进⾏绘制。
图2 ⽚元着⾊器程序2、设置⼀个缓冲区对象,这是web GL的⼀个存储区。
⽤于保存想要绘制的所有顶点的数据,并且能⼀次性向顶点着⾊器输⼊多个顶点数据。
需要的操作如下,初始化时已经为要绘制的⽴⽅体指定了坐标。
function initVertexBuffers(gl) {// 创建⽴⽅体// v6----- v5// /| /|// v1------v0 |// | | | |// | |v7--- - |v4// |/ |/// v2------v3var vertices = new Float32Array([ // ⽴⽅体顶点坐标1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, // v0-v1-v2-v3 前1.0, 1.0, 1.0, 1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0, // v0-v3-v4-v5 右1.0, 1.0, 1.0, 1.0, 1.0,-1.0, -1.0, 1.0,-1.0, -1.0, 1.0, 1.0, // v0-v5-v6-v1 上-1.0, 1.0, 1.0, -1.0, 1.0,-1.0, -1.0,-1.0,-1.0, -1.0,-1.0, 1.0, // v1-v6-v7-v2左-1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0, -1.0,-1.0, 1.0, // v7-v4-v3-v2 下1.0,-1.0,-1.0, -1.0,-1.0,-1.0, -1.0, 1.0,-1.0, 1.0, 1.0,-1.0 // v4-v7-v6-v5 后]);var texCoords = new Float32Array([ // 纹理坐标1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // v0-v1-v2-v3 前0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // v0-v3-v4-v5右1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // v0-v5-v6-v1上1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // v1-v6-v7-v2 左0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // v7-v4-v3-v2下0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 // v4-v7-v6-v5 后]);var indices = new Uint8Array([0, 1, 2, 0, 2, 3, // 前4, 5, 6, 4, 6, 7, // 右8, 9,10, 8,10,11, // 上12,13,14, 12,14,15, //左16,17,18, 16,18,19, // 下20,21,22, 20,22,23 //后]);// 创建⼀个缓冲区对象var indexBuffer = gl.createBuffer();if (!indexBuffer) {return -1;}// 将顶点信息写⼊缓冲区对象if (!initArrayBuffer(gl, vertices, 3, gl.FLOAT, 'a_Position')) return -1; // 顶点坐标if (!initArrayBuffer(gl, texCoords, 2, gl.FLOAT, 'a_TexCoord')) return -1;// 纹理坐标// 解绑缓冲区对象gl.bindBuffer(gl.ARRAY_BUFFER, null);// 将顶点坐标和纹理坐标写到缓冲区对象中gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);return indices.length;}3、设置⿏标响应事件,监视⿏标的左键的按下拖拽动作。
旋转的彩色立方体2016
![旋转的彩色立方体2016](https://img.taocdn.com/s3/m/92ead7bd69dc5022aaea0018.png)
课程设计(论文)任务书软件学院学院桥梁专业 2 班一、课程设计(论文)题目旋转的彩色立方体二、课程设计(论文)工作自 2014 年 6 月 2 日起至2014 年 6 月 6 日止。
三、课程设计(论文) 地点: 软件学院实训中心四、课程设计(论文)内容要求:1.本课程设计的目的计算机图形学课程设计是计算机图形学课程中的知识、技术和技能的一个综合应用,是培养图形软件开发能力的综合训练。
通过课程设计,使学生更深入地理解和掌握计算机图形学理论与相关算法,巩固课内所学的知识、技术和技能,进一步提高图形软件开发的能力。
为毕业设计和毕业后从事计算机绘图、计算机辅助设计、辅助教学、辅助工程、图形处理等打下基础。
2.课程设计的任务及要求1)课程设计任务:1、绘制一个不停转动的立方体,通过键盘的方向控制旋转方向;2、实现立方体的纹理映射,为立方体的六个面分别贴上不同的纹理;3、利用消影技术,实验立方体表面的遮挡关系;4、具有比较好的动画效果,消除闪烁现象。
2)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。
(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)(7)报告按规定排版打印,要求装订平整,否则要求返工;(8)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正计算机图形学课程设计文---附录(代码及相关图片)(9)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:(1)学习态度:10分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:30分。
实现三角体和立方体的旋转
![实现三角体和立方体的旋转](https://img.taocdn.com/s3/m/69231a0bbed5b9f3f90f1c41.png)
实现三角体,正方体的3d效果及自动旋转思路如下:其实要实现三角体,正方体自动旋转效果,只需绘出立方体的三角形与四边形。
在加上gl.glRotatef(angle,x , y, z);就行了。
具体实现如下:Renderer类代码package sim.feel;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView.Renderer;public class MyRender implements Renderer {//google画图单位private int one = 0x10000;//三角体旋转角度private float triangleAngle = 0.5f;//正方体旋转角度private float quaterAngle = 0.5f;//三角体、正方体及其颜色缓冲private IntBuffer triangleBuffer;private IntBuffer quaterBuffer;private IntBuffer triangleColorBuffer;private IntBuffer quaterColorBuffer;// 三角体四个面的顶点private int[] triangle = {0, one, 0,-one, -one, one,one, -one, one,0, one, 0,one, -one, one,one, -one, -one,0, one, 0,one, -one,-one,-one, -one, one,0, one, 0,-one, -one, -one,-one, -one, one};// 正方体8个面得顶点private int[] quater = new int[] { one, one, -one,-one, one, -one,one,one, one,-one, one, one,one, -one, one,-one, -one, one,one,-one, -one,-one, -one, -one,one, one, one,-one, one, one,one, -one, one,-one, -one, one,one, -one, -one,-one, -one, -one,one,one, -one,-one, one, -one,-one, one, one,-one, one, -one,-one, -one, one,-one, -one, -one,one, one, -one,one, one, one,one, -one, -one,one, -one, one,};// 三角体各顶点的颜色(r,g,b,a)private int[] triangleColor = new int[] { // tri 4 faceone, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0,one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,};// 正方形各顶点颜色private int[] quaterColor = new int[] { 0, one, 0, one,0, one, 0, one,0,one, 0, one,0, one, 0, one,one, one / 2, 0, one,one, one / 2, 0,one,one, one / 2, 0, one,one, one / 2, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,0, 0, one,one,0, 0, one, one,0,0, one, one,0,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one};//初始化Bufferpublic void init() {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangle.length * 4);ByteBuffer byteColorBuffer = ByteBuffer.allocateDirect(triangleColor.length * 4);ByteBuffer byteQuaterBuffer = ByteBuffer.allocateDirect(quater.length * 4);ByteBuffer byteQuterColorBuffer = ByteBuffer.allocateDirect(quaterColor.length * 4);byteBuffer.order(ByteOrder.nativeOrder());byteColorBuffer.order(ByteOrder.nativeOrder());byteQuaterBuffer.order(ByteOrder.nativeOrder());byteQuterColorBuffer.order(ByteOrder.nativeOrder());triangleBuffer = byteBuffer.asIntBuffer();triangleColorBuffer = byteColorBuffer.asIntBuffer();quaterBuffer = byteQuaterBuffer.asIntBuffer();quaterColorBuffer = byteQuterColorBuffer.asIntBuffer();triangleBuffer.put(triangle);triangleColorBuffer.put(triangleColor);quaterBuffer.put(quater);quaterColorBuffer.put(quaterColor);triangleBuffer.position(0);triangleColorBuffer.position(0);quaterBuffer.position(0);quaterColorBuffer.position(0);}@Overridepublic void onDrawFrame(GL10 gl) {// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置gl.glLoadIdentity();// 初始化triangleBuffer与triangleColorBufferinit();// 左移1.5f并向里移6.0fgl.glTranslatef(-1.5f, 0.0f, -6.0f);// 旋转gl.glRotatef(triangleAngle, 0.0f, 1.0f, 0.0f);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置顶点及颜色gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);// 绘制for (int i = 0; i < 4; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3);}gl.glFinish();// 重置观察模型gl.glLoadIdentity();gl.glTranslatef(1.5f, 0.0f, -6.0f);gl.glRotatef(quaterAngle, 1.0f, 0.0f, 0.0f);gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, quaterColorBuffer);// 绘制for (int i = 0; i < 6; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);}gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);// 旋转角度+0.5ftriangleAngle += 0.5f;quaterAngle += 0.5f;}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {float ratio = (float) width / height;gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig arg1) {// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 黑色背景gl.glClearColor(0, 0, 0, 0);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 清除深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所做深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);} }效果图:。
华电_计算机图形学实验报告
![华电_计算机图形学实验报告](https://img.taocdn.com/s3/m/227406c858f5f61fb73666a8.png)
课程设计(综合实验)报告=实验名称 OpenGL基本图元绘制实验课程名称计算机图形学||专业班级:计算机11K1学生姓名:王粲学号:111909010118成绩:指导教师:姜丽梅实验日期:2014.4.20实验一、OpenGL基本图元绘制实验一、实验目的及要求1.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
2.掌握基本的二维线画图元的绘制算法及属性,掌握OpenGL基本图元的绘制。
3.理解二维、三维图形的绘制流程,掌握二维图形和三维图形的图形变换。
4.了解形体的真实感表示的内容,包括消隐技术、简单光照明模型、多边形的明暗绘制技术以及纹理映射技术。
5.要求使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序实现基本图元绘制。
6.要求对绘制的简单场景综合利用几何变换或gluLookAt函数实现交互式三维观察程序。
二、实验内容在两个具有不同属性的窗口中分别显示一个旋转的三角形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。
明确程序包括哪些函数,各个函数的功能以及整个流程,从而为进一步做综合性的图形绘制实验奠定基础。
三、所用仪器、设备Windows XP系统,Visual C++,OpenGL及GLUT库四、实验方法与步骤先配置环境,把相关文件放到相应的文件夹C:\Program Files\Microsoft Visual Studio\VC98\Include\GLC:\WINDOWS\system32C:\Program Files\Microsoft Visual Studio\VC98\Lib再通过VC++进行编译五、程序代码#include <gl/glut.h>#include <stdlib.h>#include < stdio.h >#include <math.h>#define DEG_TO_RAD 0.017453static GLfloat theta = 0.0;GLfloat r = 1.0; //设置正方形的初始颜色GLfloat g = 0.0;GLfloat b = 0.0;int singleb,doubleb;void display(void){ glClear(GL_COLOR_BUFFER_BIT); //正方形颜色渐变glColor3f(r, g,b);r = r - 0.002;g = g + 0.002;b = b + 0.001;if(r < 0.001){ r = 1.0;g = 0.0;b = 0.0; }glBegin(GL_POLYGON);glVertex2f(cos(DEG_TO_RAD*theta), sin(DEG_TO_RAD*theta));glVertex2f(cos(DEG_TO_RAD*(theta+90)),sin(DEG_TO_RAD*(theta+90)));glVertex2f(cos(DEG_TO_RAD*(theta+180)),sin(DEG_TO_RAD*(theta+180)));glVertex2f(cos(DEG_TO_RAD*(theta+270)), sin(DEG_TO_RAD*(theta+270)));glEnd();glutSwapBuffers();}void spinDisplay (void) //正方形转动弧度设置{theta = theta +0.1;if (theta > 360.0)theta = theta - 360.0;glutSetWindow(singleb);glutPostWindowRedisplay(singleb);glutSetWindow(doubleb);glutPostWindowRedisplay(doubleb);}void spinDisplay1(void){glutPostRedisplay();}void myReshape(int w, int h){glViewport(0, 0, w, h); //指定平面上一个矩形裁剪区域,glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(-1.*(GLfloat)w/(GLfloat)h, 1.*(GLfloat)w/(GLfloat)h, -1., 1.);}void mouse(int button,int state,int x,int y) //鼠标定义{ switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){ glutIdleFunc(spinDisplay1);}break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);break;default:break;}}void main(int argc, char** argv) //主函数{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(500, 500);singleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(600, 100);glutInitWindowSize(500, 500);doubleb=glutCreateWindow("spinning square"); glClearColor(1.0, 1.0, 0.0, 0.1);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutMainLoop();}六、实验结果实验二、OpenGL三维观察综合实验一、目的与要求7.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
7.1 旋转立方体——创建三维空间教学设计
![7.1 旋转立方体——创建三维空间教学设计](https://img.taocdn.com/s3/m/fab52d0dad02de80d5d84058.png)
课题小结
(3分钟)
(1)引导回顾本课题的学习内容、技术技能要点;
(2)带领学生探索完成任务的新方法。
(1)回顾和总结本课题学习内容。
(2)探索完成任务的新方法。
拓展提升
(2分钟)
布置课后作业“三维盒子的打开”,提示技术要点。
1创建2个空图层
2创建各自的父子关系,制作动画
3渲染导出合成
4整理工程 增加可移植性
(5)提示操作技巧。
(6)辅导和答疑。
(1)观看和倾听教师操作和讲解。
(2)理清空1层和空2层的关系。了解父子关系的用途。
(3)结合教材、完成旋转立方体制作。
展示评价
(17分钟)
(1)展示评价内容及标准
项目
评价标准
得分
(1)视频中的立方体是怎么制作的?
(2)立方体又是怎么进行倾斜旋转的?
(1)观看视频,小组讨论;
(2)小组代表交流讨论结果;
(3)聆听老师的分析。
目标展示
(2分钟)
(1)开启对象的三维属性;
(2)在不同视图中构建对象;
(3)旋转动画的制作;
了解本课题学习内容,明确学习目标。
新课教学
(50分钟)
活动1创建立方体(30分钟
(3)能制作旋转的立方体实例。
素 养
(1)主动学习新知识、新技能技术。
(2)培养学生随时存盘职业习惯。
(3)精益求精的品质意识。
教学重点
对象三维属性的开启、三维对象的构建。
教学难点
利用父子关系制作倾斜旋转的立方体动画。
教学方法
演示法,探究法,小组合作法
教学环境
硬件环境:多媒体机房或者多媒体教室
计算机专业课程设计OPENGL旋转立方体
![计算机专业课程设计OPENGL旋转立方体](https://img.taocdn.com/s3/m/9f3f6379168884868762d622.png)
西安文理学院计算机科学系课程设计报告设计名称:软件课程设计设计题目:旋转立方体的设计学生学号:专业班级:学生姓名:学生成绩:指导教师(职称):课题工作时间:2010.5.31至2010.6.11说明:1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。
2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。
3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。
4、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。
答辩小组成员应由2人及以上教师组成。
5、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设计的情况另行规定。
6、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。
计算机科学系课程设计任务书1.谭浩强C程序设计(M)(第三版)清华大学出版社20102.严蔚敏.吴伟民数据结构[M] 高等教育20043.钱能C++程序设计教程(M)(第二版)清华大学出版社20094.郑丽Visual Basic程序设计清华大学出版社2009-10-29指导教师:系主任:日期:2010 年 5 月 28 日计算机科学系课程设计进度安排表指导教师签名:2010年5 月 28 日指导教师评语答辩记录表成绩评定表学生姓名:学号:班级:摘要软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基本知识。
画出正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思想。
题目难点在于实现可视化界面的交互、以及图像的旋转过程。
分析题目可以得出程序可以大致分为两个方面的内容:1.画出一个正方体。
2.使正方体旋转起来。
经过查找相关资料,本程序采用功能强大的图形库OPENGL并调用一系列WINDOWS API采用C/C++语言在Microsoft Visual C++6.0环境下编写。
计算机图形学实验及课程设计
![计算机图形学实验及课程设计](https://img.taocdn.com/s3/m/edf1adc16137ee06eef91800.png)
实验12 颜色渐变立方体
12.1 实验目的
掌握凸多面体消隐算法。 掌握双线性颜色插值算法。 建立基本三维场景。
实验12 颜色渐变立方体
12.2 实验要求
建立三维坐标系Oxyz,原点位于屏幕客户区中 心,x轴水平向右为正,y轴铅直向上为正,z轴 垂直于屏幕指向观察者。 以原点为体心绘制透视投影立方体,立方体8 个顶点的颜色分别为黑色、白色、红色、绿色、 蓝色、黄色、品红色和青色。背景色为黑色, 如图12-1所示。
实验4 二维几何变换
4.2 实验要求
使用静态切分视图,将窗口分为左右窗格。左窗格为继承于
CFormView类的表单视图类CLeftPortion,右窗格为一般视图
类CTestView。 左窗格提供代表“图形顶点数”(4、8、16和32)、“平移变 换”(x方向和y方向)、“旋转变换”(逆时针和顺时针)和 “比例变换”(放大和缩小)的滑动条,用于控制右窗格内的 图形变化。 右窗格内以屏幕客户区中心为图形的几何中心,绘制图形顶点 数从4变化为8、16和32的正多边形。为了表达图形的旋转,多
实验8 动态三视图
8.3 效果图
多面体动态三视图的效果如图8-1所示。
图8-1 多面体动态三视图的效果图
实验9 动态绘制Bezier曲线
9.1实验目的
掌握直线的参数表示法。 掌握德卡斯特里奥算法的几何意义。 掌握绘制二维Bezier曲线的方法。
实验9 动态绘制Bezier曲线
9.2 实验要求
实验8 动态三视图
8.1实验目的
掌握主视图变换矩阵。 掌握俯视图变换矩阵。 掌握侧视图变换矩阵。 掌握斜等测图绘制方法。
实验8 动态三视图
计算机图形学---图形几何变换的实现
![计算机图形学---图形几何变换的实现](https://img.taocdn.com/s3/m/e5250f01ad51f01dc381f119.png)
实验五图形几何变换的实现班级 08信计2班学号 20080502057 姓名冯双捷分数一.实验目的和要求1.掌握二维、三维图形基本变换的变换原理;2.利用TurboC实现二维、三维图形的基本变换和符合变换3.屏幕显示变换过程和变换结果。
二.实验内容1.原程序实现二维图形(直线)的平移变换;=±(1)沿x轴的平移公式:'x x r=±(2)沿y轴的平移公式:'y y s2.源程序实现三维图形(立方体)的旋转变换和比例变换。
(1)旋转变换即图形围绕圆心逆时针旋转一定的角度;(2)比例变换即对象距圆点的距离按照一定比例进行变换。
三.实验结果分析1.二维平移程序代码#include <stdio.h>#include <graphics.h>#include <conio.h>int initjuzhen(m)int m[3][3];{int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)m[i][j]=0;for(i=0;i<3;i++)m[i][i]=1;}main(){int x0,y0,x1,y1,i,j;int a[3][3];char key;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(2);x0=250;y0=120;x1=350;y1=220;line(x0,y0,x1,y1);for(;;){outtextxy(100,400,"<-:left ->:right^:up v:down Esc->exit");key=getch();initjuzhen(a);switch(key){case 75:a[2][0]=-10;break;case 77:a[2][0]=10;break;case 72:a[2][1]=-10;break;case 80:a[2][1]=10;break;case 27:exit();break;}x0=x0*a[0][0]+y0*a[1][0]+a[2][0];y0=x0*a[0][1]+y0*a[1][1]+a[2][1];x1=x1*a[0][0]+y1*a[1][0]+a[2][0];y1=x1*a[0][1]+y1*a[1][1]+a[2][1];clearviewport();line(x0,y0,x1,y1);}closegraph();}运行结果见文件夹:ERWEI2.三维图形旋转转换,比例变换程序代码:#include <stdio.h>#include <math.h>#include <graphics.h>#include <conio.h>#include <time.h>#include <ctype.h>#define ZOOM_IN 0.9#define ZOOM_OUT 1.1int turn1[3];typedef struct{float x;float y;float z;}point;typedef struct{float x;float y;}point2d;typedef struct{float x;float y;float h;point biao[8];}fanti;void make_box(float x,float y,float h,fanti *p) {p->x=x;p->y=y;p->h=h;p->biao[0].x=x/2;p->biao[0].y=y/2;p->biao[0].z=h/2;p->biao[1].x=-x/2;p->biao[1].y=y/2;p->biao[1].z=h/2;p->biao[2].x=-x/2;p->biao[2].y=-y/2;p->biao[2].z=h/2;p->biao[3].x=x/2;p->biao[3].y=-y/2;p->biao[3].z=h/2;p->biao[4].x=x/2;p->biao[4].y=y/2;p->biao[4].z=-h/2;p->biao[5].x=-x/2;p->biao[5].y=y/2;p->biao[5].z=-h/2;p->biao[6].x=-x/2;p->biao[6].y=-y/2;p->biao[6].z=-h/2;p->biao[7].x=x/2;p->biao[7].y=-y/2;p->biao[7].z=-h/2;}void turn2d(point *p,point2d *q){q->x=p->x+p->z*cos(0.25);q->y=p->y+p->z*sin(0.25);}void initm(float mat[][4]){int count;for(count=0;count<4;count++){mat[count][0]=0.;mat[count][1]=0.;mat[count][2]=0.;mat[count][3]=0.;mat[count][count]=1.;}return;}void transform(point *p,point *q,float tm[][4]){float xu,yv,zw,h;xu=tm[0][0]*p->x+tm[1][0]*p->y+tm[2][0]*p->z+tm[3][0];yv=tm[0][1]*p->x+tm[1][1]*p->y+tm[2][1]*p->z+tm[3][1];zw=tm[0][2]*p->x+tm[1][2]*p->y+tm[2][2]*p->z+tm[3][2];p->x=xu;p->y=yv;p->z=zw;return;}void rotationx(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[1][1]=cos(rad*alfa);tm[1][2]=sin(rad*alfa);tm[2][1]=-tm[1][2];tm[2][2]=tm[1][1];return;}void rotationz(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[0][1]=sin(rad*alfa);tm[1][0]=-tm[0][1];tm[1][1]=tm[0][0];return;}void rotationy(point *p,float alfa,float tm[][4]) {float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[2][0]=sin(rad*alfa);tm[0][2]=-tm[2][0];tm[2][2]=tm[0][0];return;}void adjust(point *p,point *q){float t[4][4];switch(turn1[0]){case 1:rotationy(p,2,t);transform(p,q,t);break;case -1:rotationy(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[1]){case 1:rotationz(p,2,t);transform(p,q,t);break;case -1:rotationz(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[2]){case 1:q->x=ZOOM_IN*p->x;q->y=ZOOM_IN*p->y;q->z=ZOOM_IN*p->z;break;case -1:q->x=ZOOM_OUT*p->x;q->y=ZOOM_OUT*p->y;q->z=ZOOM_OUT*p->z;break;default:break;}}void drawbox(fanti *p){point2d fan2d[8];int i;for(i=0;i<=7;i++){adjust(&p->biao[i],&p->biao[i]);turn2d(&p->biao[i],&fan2d[i]);fan2d[i].x+=300;fan2d[i].y+=200;}clearviewport();setcolor(2);outtext("\n ->:right\n <-:left\n ^:up\n v:down");moveto(0,10);outtext("\n page up:zoom in\n page down:zoom out\n space:Redraw\n Esc:exit");for(i=0;i<=3;i++){if(i==3){line(fan2d[i].x,fan2d[i].y,fan2d[0].x,fan2d[0].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[4].x,fan2d[4].y);}else{line(fan2d[i].x,fan2d[i].y,fan2d[i+1].x,fan2d[i+1].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[i+5].x,fan2d[i+5].y);}line(fan2d[i].x,fan2d[i].y,fan2d[i+4].x,fan2d[i+4].y);}}void main(){int gd=DETECT,gm,i,j;char key;float x,y,h;fanti a1;x=100;y=100;h=100;initgraph(&gd,&gm," ");make_box(x,y,h,&a1);drawbox(&a1);for(;;){turn1[0]=0;turn1[1]=0;turn1[2]=0;key=getch();switch(key){case 77:turn1[0]=1;break;case 75:turn1[0]=-1;break;case 72:turn1[0]=1;break;case 80:turn1[0]=-1;break;case 73:turn1[2]=1;break;case 81:turn1[2]=-1;break;case 32:make_box(x,y,h,&a1);break;case 27:exit();break;default:key=0;break;}if(key!=0)drawbox(&a1);}closegrapg();}运行结果见文件夹:SANWEI3.分析使用矩阵保存图形的坐标位置的方法,二维图形的平移就是一个坐标位置移到另一个坐标位置的重定位过程;对于三维的图形的旋转变换就是图形相应的矩阵进行角度的初等变换,而比例变换即是图形矩阵的相应比例变换。
计算机图形学报告
![计算机图形学报告](https://img.taocdn.com/s3/m/ef5cc164cc17552706220801.png)
. . . . .. . 优质资料 .. 计算机图形学 (2017年秋季学期)实验 报 告系别:计算机科学与技术 班级: : 学号:实验名称:2-真实感图形绘制2020-11-132/3《计算机图形学》实验报告实验名称真实感图形绘制 实验序号 2实验日期 2017.12.13 实验人 一、实验目的、要求与环境1.目的:通过实验,学生应掌握通过计算机程序进行真实感图形绘制的基本原理,特别是对三维显示对象进行纹理映射的基本方法,将理论和实际应用切实结合起来。
2.要求:对一个三维立方体进行旋转,对其6个不同的面进行6个不同图像的纹理映射,并进行投影变换与显示,分析增强后的视觉效果,提交实验报告。
3.环境:Windows 7操作系统Microsoft Visual Studio 2005OpenGL 函数库4. 自带位图文件(换成你自己的图像文件):总成绩:评语:日期:2020-11-1311/12二、实验容与步骤1. 准备相关图像文件。
2. 进行立方体各面图像与旋转速度的大体设计。
3.在Windows 7 操作系统上,打开Microsoft Visual Studio 2005,编写相关程序,完成程序主体框架结构。
4.编写六面体显示相关的程序代码。
5.编写六面体旋转相关的程序代码。
6.编写深度检测相关的程序代码。
7. 编写纹理载入功能的相关程序代码。
8. 编写纹理参数定义功能的相关程序代码。
9. 编写纹理映射功能的相关程序代码。
10.对程序进行相关调试,修改程序,去除其中的BUG 。
11. 观察纹理映射后的六面体的旋转显示,与预想的结果进行对比,修改相关程序参数。
12.截屏,保留实验结果,进行实验结果分析,并撰写实验报告。
2020-11-13 2/32020-11-13 11/12四、编译过程截图五、实验结果与分析(下面是一个例子,换上你自己的图)实验结果:实验分析程序通过glBindTexture(GL_TEXTURE_2D, lastTextureID);语句,完成了恢复之2020-11-13 2/32020-11-13 11/122020-11-13 2/32020-11-13 11/122020-11-13 2/3。
旋转3D立方体
![旋转3D立方体](https://img.taocdn.com/s3/m/dc519b37915f804d2b16c1b6.png)
旋转3D立方体——《计算机图形学》Project2文档俞晨光0830*******复旦大学2011.12.11 1.功能说明本程序实现了一个3D立方体的屏幕投影功能,立方体的每个面用不同颜色标识,可以任意旋转观察角度。
程序运行的界面如下图:坐标系:如上图所示,空间直角坐标系的原点O在立方体中心,屏幕向右为X轴正方向,屏幕向上为Y轴正方向,垂直屏幕平面向外为Z轴正方向。
观察采用正投影,即面向Z轴正方向观察立方体在xOy平面的投影。
操作方法:利用键盘WS, AD, QE, R七个按键控制旋转立方体:W:绕X轴顺时针旋转S:绕X轴逆时针旋转A:绕Y轴顺时针旋转D:绕Y轴逆时针旋转E:绕Z轴顺时针旋转Q:绕Z轴逆时针旋转R:立方体回到初始位置2.开发与运行环境说明本项目使用C++开发,使用OpenGL的库函数(只用绘单独像素点的函数),并利用GLUT工具包显示窗口和接受键盘输入。
具体如下:操作系统:Windows XP SP3C++编译器:MinGW-5.1.6GLUT版本:glut-3.7.6IDE:Eclipse Indigo for JavaEE + CDT可执行程序位于/Release 和/Debug目录下,双击RotateCube.exe文件即可运行。
请确保动态链接库文件glut32.dll与可执行文件在同一目录下。
3.程序说明设计类图如下:绘制立方体的算法步骤:1)将立方体缩放和移位到适合屏幕显示的坐标位置2)用Z缓冲区算法,绘制立方体的每一表面:1.对该表面在xOy平面上的投影部分进行扫描转换,先利用Bresenham画线算法绘制四边形,再用种子填充法填充该四边形。
2.求出该平面的平面方程(利用平面的法向量)3.对填充完的四边形内的每一个像素,使用Z缓冲区算法进行可见面的判别,并将其写入帧缓存4.参考资料1.《Computer Graphics with OpenGL》(Third Edition)Donald Hearn, M Pauline Baker2.《计算机图形学》(第三版)孙家广等。
计算机图形学实验报告三
![计算机图形学实验报告三](https://img.taocdn.com/s3/m/29c4bbb77e21af45b207a866.png)
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
计算机图形学chap7 三维变换及三维观察
![计算机图形学chap7 三维变换及三维观察](https://img.taocdn.com/s3/m/51f144d03186bceb19e8bb3e.png)
关于x轴进行对称变换的矩阵计算形式 为:
1 0 0 0 1 0 TFx 0 0 1 0 0 0
0 0 0 1
22
三维基本几何变换——对称变换
关于Y轴进行对称变换的矩阵计算形式为:
1 0 TFy 0 0
0 1 0 0 0 1 0 0 0 1 0 0
23
三维基本几何变换——对称变换
关于Z轴进行对称变换的矩阵计算形式为:
1 0 0 1 TFz 0 0 0 0
0 0 0 0 1 0 0 1
24
三维基本几何变换——对称变换
关于原点对称
D E O B x A C y E* x E
*
F
F
*
F* C* O O A* y B* x B* x D
*
A* F*
C* y
* D
E* C*
* D
O
A*
B*
y
(a)
(b)
(c)
(d)
(b)a绕x正向旋转90°(c) a绕y正向旋转90°(d) a绕x正向旋转90°
三维基本几何变换——对称变换
关于坐标平面对称
T-1Rz(θ)=TRz(-θ) T-1Rz(-θ)=TRz(θ)
0 0 cos 0 0 sin 1 0 0 0 1 0
sin cos 0 0
0 0 0 0 1 0 0 1
32
三维复合变换
三维复合变换是指图形作一次以上的变 换,变换结果是每次变换矩阵的乘积。
b 1 h 0
c f 1 0
0 0 0 1
26
沿z方向错切:Tshz= 1 0 0 0 沿x方向错切:Tshx= 1 d g 0 沿y方向错切:Tshy= 1 0 0 0
计算机图形学实验报告
![计算机图形学实验报告](https://img.taocdn.com/s3/m/c08a233e4b73f242326c5f08.png)
实验一:二维图形的绘制和变换一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
二、实验内容二维图形的绘制和变换,绘制包括直线、三角形、矩形,变换包括平移、旋转、缩放。
三、实验原理二维图形的绘制和变换:在图形系统中,矩阵是实现变换的标准方法。
平移变换、旋转变换和缩放变换的矩阵表示形式如下。
平移变换:P’=P+T。
旋转变换:P’=R*P。
缩放变换:P’=S*P。
引入齐次坐标后,平移、旋转和缩放变换的矩阵表示形式如下所示。
(1)平移变换:[1 0 0][x’, y’, 1] = [x, y, 1] [0 1 0][tx ty 1](2)旋转变换:[cosɵsinɵ0][x’, y’, 1] = [x, y, 1] [-sinɵcosɵ0][0 0 1](3)缩放变换:[s x0 0][x’, y’, 1] = [x, y, 1] [0 s y0][0 0 1]四、实验代码及结果1.编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。
实验核心代码void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);draw_triangle ();glLoadIdentity ();glRotatef (90.0, 0.0, 0.0, 1.0);draw_triangle ();glLoadIdentity ();glScalef (0.5, 0.5, 1.0);draw_triangle ();glFlush ();}2. 实现如图功能#include<windows.h>#include <GL/glut.h>#include <stdlib.h>void init(void){glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH); }void draw_triangle(void){glShadeModel(GL_SMOOTH);glColor3f(0.2,0.7,0.30);glBegin (GL_TRIANGLES);//画出三角形,为混合色填充方式glVertex2f(50.0, 25.0);glColor3f(0.4,0.5,0.60);glVertex2f(150.0, 25.0);glColor3f(0.9,0.7,0.8);glVertex2f(100.0, 100.0);glEnd();}void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);glRotatef (90.0, 0.0, 0.0, 1.0);glScalef (0.5, 0.5, 1.0);draw_triangle ();//经过三种变换后画出图形glFlush ();}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h)gluOrtho2D (-200.0, 250.0, -100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口elsegluOrtho2D (-200.0*(GLfloat)w/(GLfloat)h,250.0*(GLfloat)w/(GLfloat)h, -50.0, 200.0);glMatrixMode(GL_MODELVIEW);int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (600, 600);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}实验二:使用中点扫描算法绘制直线和圆一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
实现三角体和立方体的旋转
![实现三角体和立方体的旋转](https://img.taocdn.com/s3/m/69231a0bbed5b9f3f90f1c41.png)
实现三角体,正方体的3d效果及自动旋转思路如下:其实要实现三角体,正方体自动旋转效果,只需绘出立方体的三角形与四边形。
在加上gl.glRotatef(angle,x , y, z);就行了。
具体实现如下:Renderer类代码package sim.feel;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView.Renderer;public class MyRender implements Renderer {//google画图单位private int one = 0x10000;//三角体旋转角度private float triangleAngle = 0.5f;//正方体旋转角度private float quaterAngle = 0.5f;//三角体、正方体及其颜色缓冲private IntBuffer triangleBuffer;private IntBuffer quaterBuffer;private IntBuffer triangleColorBuffer;private IntBuffer quaterColorBuffer;// 三角体四个面的顶点private int[] triangle = {0, one, 0,-one, -one, one,one, -one, one,0, one, 0,one, -one, one,one, -one, -one,0, one, 0,one, -one,-one,-one, -one, one,0, one, 0,-one, -one, -one,-one, -one, one};// 正方体8个面得顶点private int[] quater = new int[] { one, one, -one,-one, one, -one,one,one, one,-one, one, one,one, -one, one,-one, -one, one,one,-one, -one,-one, -one, -one,one, one, one,-one, one, one,one, -one, one,-one, -one, one,one, -one, -one,-one, -one, -one,one,one, -one,-one, one, -one,-one, one, one,-one, one, -one,-one, -one, one,-one, -one, -one,one, one, -one,one, one, one,one, -one, -one,one, -one, one,};// 三角体各顶点的颜色(r,g,b,a)private int[] triangleColor = new int[] { // tri 4 faceone, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0,one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,};// 正方形各顶点颜色private int[] quaterColor = new int[] { 0, one, 0, one,0, one, 0, one,0,one, 0, one,0, one, 0, one,one, one / 2, 0, one,one, one / 2, 0,one,one, one / 2, 0, one,one, one / 2, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,0, 0, one,one,0, 0, one, one,0,0, one, one,0,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one};//初始化Bufferpublic void init() {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangle.length * 4);ByteBuffer byteColorBuffer = ByteBuffer.allocateDirect(triangleColor.length * 4);ByteBuffer byteQuaterBuffer = ByteBuffer.allocateDirect(quater.length * 4);ByteBuffer byteQuterColorBuffer = ByteBuffer.allocateDirect(quaterColor.length * 4);byteBuffer.order(ByteOrder.nativeOrder());byteColorBuffer.order(ByteOrder.nativeOrder());byteQuaterBuffer.order(ByteOrder.nativeOrder());byteQuterColorBuffer.order(ByteOrder.nativeOrder());triangleBuffer = byteBuffer.asIntBuffer();triangleColorBuffer = byteColorBuffer.asIntBuffer();quaterBuffer = byteQuaterBuffer.asIntBuffer();quaterColorBuffer = byteQuterColorBuffer.asIntBuffer();triangleBuffer.put(triangle);triangleColorBuffer.put(triangleColor);quaterBuffer.put(quater);quaterColorBuffer.put(quaterColor);triangleBuffer.position(0);triangleColorBuffer.position(0);quaterBuffer.position(0);quaterColorBuffer.position(0);}@Overridepublic void onDrawFrame(GL10 gl) {// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置gl.glLoadIdentity();// 初始化triangleBuffer与triangleColorBufferinit();// 左移1.5f并向里移6.0fgl.glTranslatef(-1.5f, 0.0f, -6.0f);// 旋转gl.glRotatef(triangleAngle, 0.0f, 1.0f, 0.0f);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置顶点及颜色gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);// 绘制for (int i = 0; i < 4; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3);}gl.glFinish();// 重置观察模型gl.glLoadIdentity();gl.glTranslatef(1.5f, 0.0f, -6.0f);gl.glRotatef(quaterAngle, 1.0f, 0.0f, 0.0f);gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, quaterColorBuffer);// 绘制for (int i = 0; i < 6; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);}gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);// 旋转角度+0.5ftriangleAngle += 0.5f;quaterAngle += 0.5f;}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {float ratio = (float) width / height;gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig arg1) {// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 黑色背景gl.glClearColor(0, 0, 0, 0);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 清除深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所做深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);} }效果图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转
实
验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150
实
验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。
绘制一个三维立方体。
实验原理Java3D
在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:
在实验时,要引入相关的jar包,显示如下所示:
实验环境硬件平台:PC机
软件:Windows7平台,eclipse集成开发环境,java编程语言。
Java 3D
实验步骤1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
(2)点击键盘上的“X”键,让正方体在x轴上进行旋转,每次15度截图显示如下所示:
(3)点击键盘上的“Y”键,让正方体在Y轴上进行旋转,每次15度
(4)点击键盘上的“Z”键,让正方体在Z轴上进行旋转,每次15度
实验总结
通过本次实验,让我了解并掌握了三维立方体的旋转,通过编写实验的测试代码进行了原理的验证,在本次试验中,绘制的过程也是遇到了不少的问题,通过查阅相关资料和问同学也得到了解决,收获很大,我觉得实验就是一个检验在课本上所学的知识是否真正掌握的一个很好的方法,通过实验你会发现你原本觉得会做的实验其实真正做起来也不是很容易,本次实验完成的还可以,与此同时也加深了我对于计算机图形学的兴趣,在今后的学习中,还会更加努力,争取学到更多的算法
指
导
教
师
意
见签名:年月日。