裁剪空间法--实现细节
来源:互联网 发布:win10解压缩软件 编辑:程序博客网 时间:2024/05/29 04:28
下面从类FrustumG的函数,就像下面描述的平面,假设给予的参数矩阵A=M*P:
#define m(row,col) m[col*4+row-5]
void FrustumG::setFrustum(float *m) {
pl[NEARP].setCoefficients(
m(3,1) + m(4,1),
m(3,2) + m(4,2),
m(3,3) + m(4,3),
m(3,4) + m(4,4));
pl[FARP].setCoefficients(
-m(3,1) + m(4,1),
-m(3,2) + m(4,2),
-m(3,3) + m(4,3),
-m(3,4) + m(4,4));
pl[BOTTOM].setCoefficients(
m(2,1) + m(4,1),
m(2,2) + m(4,2),
m(2,3) + m(4,3),
m(2,4) + m(4,4));
pl[TOP].setCoefficients(
-m(2,1) + m(4,1),
-m(2,2) + m(4,2),
-m(2,3) + m(4,3),
-m(2,4) + m(4,4));
pl[LEFT].setCoefficients(
m(1,1) + m(4,1),
m(1,2) + m(4,2),
m(1,3) + m(4,3),
m(1,4) + m(4,4));
pl[RIGHT].setCoefficients(
-m(1,1) + m(4,1),
-m(1,2) + m(4,2),
-m(1,3) + m(4,3),
-m(1,4) + m(4,4));
}
#undef M
函数setCoefficients是从类Plane定义的:
void Plane::setCoefficients(float a, float b, float c, float d) {
// set the normal vector
normal.set(a,b,c);
//compute the lenght of the vector
float l = normal.length();
// normalize the vector
normal.set(a/l,b/l,c/l);
// and divide d by th length as well
this->d = d/l;
}
为了从OpenGL状态函数glGetFloatv得到矩阵M和P:
float m[16],p[16];
glGetFloatv(GL_PROJECTION_MATRIX,p);
glGetFloatv(GL_MODELVIEW_MATRIX,m);
矩阵相乘就是计算A=M*P。一个矩阵相乘可以如下方式:
void multMat(float *res,float *a, float *b) {
for (int i=0;i<4;i++) {
for (int j = 0;j < 4;j++) {
res[i*4+j] = 0.0;
for (int k = 0; k < 4; k++) {
res[i*4+j] += a[i*4+k] * b[k*4+j];
}
}
}
}
下面就是对于懒惰的人的解决方案,对我们使用OpenGL实现矩阵相乘(在我的笔记本电脑上它实际上是比较快的):
void multMat2(float *res, float *a, float *b) {
glPushMatrix();
glLoadMatrixf(b);
glMultMatrixf(a);
glGetFloatv(GL_MODELVIEW_MATRIX, res);
glPopMatrix();
}
一旦平面计算出来,那么接下来的点测试,球体和立方体,就是跟几何体分析的一样了。
英文地址
转载于:http://www.arcosu.com/post/index/106
- 裁剪空间法--实现细节
- 裁剪空间法-引出平面
- 裁剪空间
- 多边形裁剪圆的实现细节之求直线段与圆的交点
- 多边形裁剪圆的实现细节之求出一段圆弧的中点
- 齐次空间的裁剪
- iphone 实现裁剪图片
- MapGIS裁剪功能实现
- [COCOS2D-X]裁剪实现
- jquery实现图片裁剪
- 裁剪区域的实现
- Android 自定义裁剪实现
- 图像裁剪的实现
- COCOS2D-X]裁剪实现
- Java实现图片裁剪
- java实现图片裁剪
- java实现图片裁剪
- c#实现图片裁剪
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- Android display架构分析
- 适配器模式
- 安卓开发32:Paint 画笔
- 免费 开发资源库 android web
- 裁剪空间法--实现细节
- java反射机制
- Category(范畴)的使用方法与介绍
- UVA 10954 Add All 全加一起 模拟+贪心+优先队列
- GBK与GB2312
- 获取加载Kernel32.dll的地址
- 如何在客户端配置ODBC来访问远程DB2 for Windows服务器
- HDOJ4612 Warm up
- java中volatile关键字的含义