opengl学习笔记
文章平均质量分 69
tmljs1988
这个作者很懒,什么都没留下…
展开
-
求直线上最近的二点(在公垂线上)
<br />直线是用一个点和一个方向向量(已单位化)构成.现在要求二条直线最近的点(即公垂线与两直线的交点)<br />class Cray//射线类<br />{<br />protected:<br /> CVector_3D m_ptStart;//原点<br /> CVector_3D m_ptDir;//方向<br />……<br />}<br />如果二个直线平行,则两条直线r1,r2的方向向量的内积必为1或-1,此时可计算S2在r1上的投影(点乘),在r1上计算投影点为Sproje原创 2010-06-15 10:49:00 · 1774 阅读 · 0 评论 -
opengl纹理坐标
纹理贴图是先根据纹理坐标确定纹理的大小,再把纹理经缩放后贴到物体上.当纹理坐标值大于1时,会重复.如下图,红色框中的纹理坐标分别为:左下( 0.5, 0),右下(2.5, 0),右上( 2.5, 1.5),左上(0.5, 1.5),根据图片的大小将其缩放后贴到实际物体表面.原创 2010-07-13 16:27:00 · 927 阅读 · 0 评论 -
用glTranslate,glRotate来模拟gluLookAt
用glTranslate,glRotate来模拟gluLookAt,即gluLookAt的模视矩阵能由glTranslate,glRotate实现: float t= pow( 3, 0.5); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存 glLoadIdentity();原创 2011-05-20 16:59:00 · 4505 阅读 · 0 评论 -
求圆筒上的点
在做粒子系统的时候,想让粒子以圆筒的形式喷射出去,但求其圆筒面上的点(即已知一个向量s,然后求以其为轴的角度为A的圆锥上的点)时遇到了麻烦.开始准备用sin,cos等来计算,但投影起来非常麻烦,后来想到用向量,简单且实用. 在右图中,可确定出圆锥底部平面,再计算角度为A的向量(通过计算,长度取比例).可先求OC,即求AC,因为AC与AB成比例,且AC/AB=xtanA/(x+xtanA原创 2010-07-09 19:21:00 · 779 阅读 · 0 评论 -
利用四元树来计算一个坐标点绕任意轴旋转后,新坐标点的推导过程
利用四元树来计算一个坐标点绕任意轴旋转后,新坐标点的推导过程(参考《(中文版)3D数学基础图形与游戏开发.pdf》): 参考源代码:void Quaternion::setToRotateAboutAxis(const Vector3 &axis, float theta) {// The axis of rotation must be normaliz转载 2012-01-04 11:38:23 · 3120 阅读 · 0 评论 -
glut基本程序+旋转的四边形
#include "stdafx.h"#include #include #pragma comment( lib, "glut32.lib")//注意:glut.h与glut32.lib版本要一样,否则会出现链接错误:无法解析的外部符号__imp____glut原创 2011-01-06 13:12:00 · 1900 阅读 · 0 评论 -
glRasterPos2f与字体位置
glRasterPos2f(x,y)其实就相当于是glVertex2f(x,y)的坐标,只是glRasterPos2f(x,y)用于显示[字体]时设置字符的起始位置,而glVertex2f(x,y)是绘制一个2D点.且glRasterPos2f(x,y)仍受当前模视矩阵的影响,即glTranslatef()可改变字符显示的位置, glRasterPos2f(x,y)显示字体时,其位置可随模视矩阵的原创 2011-06-06 10:47:00 · 11602 阅读 · 1 评论 -
opengl光照方程的计算验证
<br />#include"stdafx.h"<br />#include<GL/glut.h><br />#include<iostream><br />usingnamespace std;<br /> <br />void Init(void)<br />{<br /> GLfloat mat_ambient[] = { 0.2, 0.2, 0.2, 1.0 };//光源环境光<br /> GLfloat mat_diffuse[] = { 0.0, 0.0, 0.0, 1.0 };//原创 2011-05-24 09:33:00 · 2153 阅读 · 2 评论 -
球光照模型
先根据经纬度计算出球面上各点,再把球分成很多小三角形,其中两极除外的四边形也分成上下二个三角形,画三角形(设为P0P1P2)时,每个点计算该面本身(pl),下面(Pdown),右面(Pright),右下面(Pdownright),求光照时,根据每个点到光源位置的经衰减后得到光线颜色(f[i]=1.0/(c0+c1*dist[i]+c2*dist[i]*dist[i])),再分别计算环境光,漫反射光,镜面反射光,加点该点的颜色上(点的颜色是该点右下面的颜色,计算时也要检测光源是否能够照到该点上,如果光照不到点原创 2010-11-08 17:28:00 · 1525 阅读 · 0 评论 -
立方体的纹理映射(黑白色交替)
1.使用透视投影,即有(phi,theta,R),2.在一个平面(P0,P1,P2,P3)(该平面为空间任一平面,可能是斜的)上,以某点为XY坐标系的原心(如P3),获取纹理坐标(u,v)上的点的实际坐标Pm,再将其投影(Project())到二维显示器上,并设置点颜色(SetPixel())为黑色或白色.其中计算(u,v)上的点的实际坐标Pm方法如下(其中P0P1P2P3是正方形,P3=P2-P1+P0,Pm= P3+u*P2P1+u*P0P1=(P1-P0)*u+(P1-P2)*v+P2-P1+P0):原创 2010-11-08 16:55:00 · 2140 阅读 · 0 评论 -
立方体明暗处理(即立方体隐面算法加上颜色)
算法是在隐面的基础上,加上了颜色双线性插值.{1}隐面:使用透视投影,即有(phi,theta,R),再用,即如果视向量S(视点E与平面上任意一点组成的向量P1:P1E)与法向量N(可由面上三个点P1P2P3组成,P1P2*P2P3)求数量积S.N >= 0,则绘制该面;否则表示人看不到该面,故要隐藏该面.(2)颜色插值类似于Z-Buffer隐面算法,对每个面,每条扫描线,每次找2个点,设置像素颜色为双线性插值颜色.Is=Interpolation(CurrentB->ScanLine,HeadE->y1,原创 2010-11-07 17:16:00 · 2025 阅读 · 0 评论 -
立方体画家消隐算法与Z-Buffer消隐算法 比较
立方体画家消隐算法与Z-Buffer消隐算法在别的方面有所类似,只是算法核心思想不同: 一.立方体Z-Buffer消隐是对于某一个像素点,不必对在靠近或远离视点的面进行排序,只需在遍历各面后找出该像素的深度最大的点(Z最大,即离视点最近)(先找深度大的点setPixel(),如果以后还有深度更大的,则通过设置新的颜色setPixel()来覆盖以前的点,其中要注意以yi为扫描线时,扫描线可能不与屏幕平行,可能是倾斜着的,就像把opengl的X轴绕Y轴旋转一个角度,如向量(1,-1,0),此次每次随x增大,z也原创 2010-11-05 16:47:00 · 2553 阅读 · 0 评论 -
立方体Z-Buffer消隐算法
Z-Buffer消隐算法:主要函数:void ReadPoint();//读入顶点表函数,此处为立方体的8个顶点m_point[8] void ReadColor();//读入颜色函数,即立方体六个面的颜色 void ReadFace();//读入面表函数,即设置面上4个点的索引值 void PolygonFill(CDC*);//填充多边形函数 void CreatBucket();//建立桶结点函数 void Et();//构造边表函数 void AddAet(Edg原创 2010-11-04 09:45:00 · 11773 阅读 · 4 评论 -
多边形有效边表填充算法
<br />绘制多边形时用桶结构,其实类似于图里面的邻接表,从上到下是桶(bucket),右边链接的指针是边(edge).<br />class Bucket //桶类<br />{<br />public:<br /> Bucket();<br /> virtual ~Bucket();<br /> int ScanLine;<br /> AET *p;//桶上的边表指针<br /> Bucket *next;<br />};<br />class Edge //边类<b原创 2010-11-03 22:18:00 · 17056 阅读 · 4 评论 -
三视图
<br />三维坐标点投影到二维屏幕上的点时:<br />x1= y- x/<br />y1= -z+ x/<br />要计算在屏幕上的投影值,即相当于下图中计算点在YZ上的坐标值,其中,X与Y,Z轴夹角均为135度,PP1=z.故可计算二维坐标,要记住屏幕窗口的原点在左上角,X往右递增,Y往下递增.<br /><br />代码如下(计算机图形学实例43(Visual C++版) 孔令德): <br />void CTestView::Transform3DTo2D(const double P3D[7][原创 2010-11-02 10:35:00 · 1935 阅读 · 0 评论 -
透视图
透视图三维投影代码如下:void CTestView::Project(int x,int y,int z)//透视变换{ double x0,y0,z0;//观察坐标系三维坐标 x0=k[1]*x-k[3]*y; y0=-k[7]*x-k[8]*y+k[2]*z; z0=-k[5]*x-k[6]*y-k[4]*z+R; x2d=D*x0/z0;y2d=D*y0/z0;//屏幕坐标系二维坐标}void CTestView::InitParameter()//初始化参数{原创 2010-11-01 19:06:00 · 991 阅读 · 0 评论 -
opengl 相机 视口 详解
本文使用的是glut库:#include"stdafx.h"#includevoid init(void){ glClearColor(0.0f,0.0f,0.0f,0.0f);}void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,0.0f,0.0f); glLoadIdentity(); glTranslatef( 0.0f, 0.0f , -1.0f); //draw a square原创 2010-10-08 22:31:00 · 5612 阅读 · 0 评论 -
不同3D坐标系上的点的坐标变换的计算
<br />在3D编程中,很多时候会遇到不同坐标系上一个点的坐标的转换的问题:即将一个坐标系上的点映射到另一坐标系上.<br />(1) 此处讨论求一个非标准坐标系上的点(相对值)在标准坐标系上的值(实际值).举个例子:假设以前的坐标系是标准的3D坐标系C1(opengl右手系):Z轴为(0,0,-1),X轴为(1,0,0),Y轴为(0,1,0).可以以Z轴为主,X轴取水平,即可求出Y轴(Y=X*Z,注意是叉乘,即外积).现在如果有另一个非标准的坐标系C2,其中心依然在原点不变,但Z轴向量Cz2为(a0,a原创 2010-10-10 11:21:00 · 4625 阅读 · 0 评论 -
opengl纹理,光照,glColor4f(),混合
glColor4f()与光照是平级的,且两者互斥,水火不容,有我没你.对于纹理图片中的某个像素P(r,g,b,1):(1)如果有光照L(Lr,Lg,Lb,x),则glColor4f(Cr,Cg,cb,Calpha)无用,像素P应该只乘以光照L,则像素P的实际颜色P1=P*L=(r*Lr,g*Lg,b*Lb,1);(注:P1的alpha恒为1,无须乘以光照的alpha值,即光照的alpha值在此原创 2011-05-25 15:44:00 · 10009 阅读 · 2 评论