立方体的纹理映射(黑白色交替)
2010-11-08 16:55
281 查看
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):
3.结果显示的是一个8*8的黑色国际象棋立方体,可由int(u*8.0)+int(v*8.0))能否被2整除来决定,可代入数据(u,v)分析出来,如想结果为int(1+1),或int(1+2)等.
4.不过,<计算机图形学VC++ 孔令德>里的代码只适合离散点,即只是离散地绘制像素,并没有画一个面.当u,v的步长很大时,会看到明显的间断.源代码如下:
5.
for(double u=0.0;u<=1.0;u+=0.005)
for(double v=0.0;v<=1.0;v+=0.005)
{
if((int(u*8.0)+int(v*8.0))%2==0)//黑白交替
{
a=0.1;
Pm.x=(Pk[1].x-Pk[0].x)*u+(Pk[1].x-Pk[2].x)*v+Pk[2].x-Pk[1].x+Pk[0].x;
Pm.y=(Pk[1].y-Pk[0].y)*u+(Pk[1].y-Pk[2].y)*v+Pk[2].y+Pk[0].y-Pk[1].y;
Pm.z=(Pk[1].z-Pk[0].z)*u+(Pk[1].z-Pk[2].z)*v+Pk[2].z+Pk[0].z-Pk[1].z;
Pn=Project(Pm);
pDC->SetPixel(MaxX/2+ROUND(Pn.x),MaxY/2-ROUND(Pn.y),RGB(a*255,a*255,a*255));
}
else
{
b=0.9;
Pm.x=(Pk[1].x-Pk[0].x)*u+(Pk[1].x-Pk[2].x)*v+Pk[2].x-Pk[1].x+Pk[0].x;
Pm.y=(Pk[1].y-Pk[0].y)*u+(Pk[1].y-Pk[2].y)*v+Pk[2].y+Pk[0].y-Pk[1].y;
Pm.z=(Pk[1].z-Pk[0].z)*u+(Pk[1].z-Pk[2].z)*v+Pk[2].z+Pk[0].z-Pk[1].z;
Pn=Project(Pm);
pDC->SetPixel(MaxX/2+ROUND(Pn.x),MaxY/2-ROUND(Pn.y),RGB(b*255,b*255,b*255));
}
}
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):
3.结果显示的是一个8*8的黑色国际象棋立方体,可由int(u*8.0)+int(v*8.0))能否被2整除来决定,可代入数据(u,v)分析出来,如想结果为int(1+1),或int(1+2)等.
4.不过,<计算机图形学VC++ 孔令德>里的代码只适合离散点,即只是离散地绘制像素,并没有画一个面.当u,v的步长很大时,会看到明显的间断.源代码如下:
5.
for(double u=0.0;u<=1.0;u+=0.005)
for(double v=0.0;v<=1.0;v+=0.005)
{
if((int(u*8.0)+int(v*8.0))%2==0)//黑白交替
{
a=0.1;
Pm.x=(Pk[1].x-Pk[0].x)*u+(Pk[1].x-Pk[2].x)*v+Pk[2].x-Pk[1].x+Pk[0].x;
Pm.y=(Pk[1].y-Pk[0].y)*u+(Pk[1].y-Pk[2].y)*v+Pk[2].y+Pk[0].y-Pk[1].y;
Pm.z=(Pk[1].z-Pk[0].z)*u+(Pk[1].z-Pk[2].z)*v+Pk[2].z+Pk[0].z-Pk[1].z;
Pn=Project(Pm);
pDC->SetPixel(MaxX/2+ROUND(Pn.x),MaxY/2-ROUND(Pn.y),RGB(a*255,a*255,a*255));
}
else
{
b=0.9;
Pm.x=(Pk[1].x-Pk[0].x)*u+(Pk[1].x-Pk[2].x)*v+Pk[2].x-Pk[1].x+Pk[0].x;
Pm.y=(Pk[1].y-Pk[0].y)*u+(Pk[1].y-Pk[2].y)*v+Pk[2].y+Pk[0].y-Pk[1].y;
Pm.z=(Pk[1].z-Pk[0].z)*u+(Pk[1].z-Pk[2].z)*v+Pk[2].z+Pk[0].z-Pk[1].z;
Pn=Project(Pm);
pDC->SetPixel(MaxX/2+ROUND(Pn.x),MaxY/2-ROUND(Pn.y),RGB(b*255,b*255,b*255));
}
}
相关文章推荐
- OpenGL 学习笔记-2015.4.18——立方体纹理映射-天空盒子-环境映射
- 绘制立方体和单个的矩阵,并映射纹理图像
- UnityShader中级篇——创建用于环境映射的立方体纹理
- 投影纹理映射(Projective Texture Mapping)详解
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射
- OpenGL 纹理映射
- 【图形学与游戏编程】开发笔记-基础篇7:纹理映射
- OpenGL纹理映射的几个问题
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射
- vtk类之vtkTextureMapToPlane:纹理映射算法, 映射2D平面上的纹理
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)
- 摸爬滚打DirectX11_day08——纹理映射
- android 使用OPENGL ES实现纹理拉伸效果-纹理映射基础
- Unity Shader 学习笔记(8) 纹理映射、凹凸映射
- 纹理映射
- DirectD3D-纹理映射
- OpenGL纹理映射总结
- OpenGL中的纹理映射
- opengl笔记2(二次曲面的纹理映射)
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射