MFC实现三维图形绘制(6)纹理实现

将图片贴到物体上,可以通过颜色映射来实现,即将纹理的颜色作为材质的漫反射光反射率和环境光反射率。

material->SetDiffuse(tf.c);//用纹理颜色作为材质的漫反射光反射率
material->SetAmbient(tf.c);//用纹理颜色作为材质的环境光反射率

为了使物体大小与纹理大小像贴合,用CT2类保存面上各顶点相对于纹理图像的坐标,在绘图时通过线性插值的方式实现一一对应。

#include"RGB.h"
class CT2  
{
public:
	CT2(void);
	virtual ~CT2(void);
	CT2(double,double);
	friend CT2 operator +(const CT2 &,const CT2 &);//运算符重载
	friend CT2 operator -(const CT2 &,const CT2 &);
	friend CT2 operator *(const CT2 &,double);
	friend CT2 operator *(double,const CT2 &);
	friend CT2 operator /(const CT2 &,double);
	friend CT2 operator+=(CT2 &,CT2 &);
	friend CT2 operator-=(CT2 &,CT2 &);
	friend CT2 operator*=(CT2 &,double);
	friend CT2 operator/=(CT2 &,double);
public:
	double u;
	double v;
	CRGB c;
};
CT2 CFill::Interpolation(double m, double m0, double m1, CT2 T0, CT2 T1)//纹理地址线性插值
{
	CT2 Texture;
	Texture = (m1 - m) / (m1 - m0) * T0 + (m - m0) / (m1 - m0) * T1;
	return Texture;
}

创建CTexture类保存纹理图像 

class CTexture
{
public:
	CTexture(void);
	virtual~CTexture(void);
	void GetImage(UINT nIDResource);//准备位图
	void DeleteObject(void);//释放位图
public:
	BYTE* image;
	BITMAP bmp;//BITMAP结构体变量
};

#include "Texture.h"

CTexture::CTexture(void)
{
	image = NULL;
}

CTexture::~CTexture(void)
{

}

void CTexture::GetImage(UINT nIDResource)//准备位图
{
	CBitmap NewBitmap;
	NewBitmap.LoadBitmap(nIDResource);
	NewBitmap.GetBitmap(&bmp);//将CBitmap的信息保存到Bitmap结构体中
	int nbytesize = bmp.bmWidthBytes*bmp.bmHeight;
	image = new BYTE[nbytesize];
	NewBitmap.GetBitmapBits(nbytesize, (LPVOID)image);
}


void CTexture::DeleteObject(void)//释放位图
{
	if(NULL != image)
		delete []image;
}

若要实现纹理的凹凸,则加入凹凸算法:

CRGB frontU = GetTextureColor(ROUND(tf.u - 1), ROUND(tf.v), pTexture);
CRGB backU = GetTextureColor(ROUND(tf.u + 1), ROUND(tf.v), pTexture);
double Bu = (frontU.blue - backU.blue) / 2;
CRGB frontV = GetTextureColor(ROUND(tf.u), ROUND(tf.v - 1), pTexture);
CRGB backV = GetTextureColor(ROUND(tf.u), ROUND(tf.v + 1), pTexture);
double Bv = (frontV.blue - backV.blue) / 2;
CVector3 DNormal = CVector3(Bu, Bv, 0);
double BumpScale = 100.0;
vf = vf + BumpScale * DNormal;
vf = vf.Normalize();

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是一个在Windows平台上开发图形用户界面程序的框架,可以使用MFC实现二维图形的几何变化。下面是一个简单的示例代码,演示如何通过MFC实现平移、旋转、缩放等几何变换。 ```cpp // 定义一个二维点类 class CPoint2D { public: double x; double y; CPoint2D(): x(0), y(0) {} CPoint2D(double x, double y): x(x), y(y) {} // 平移 void Translate(double dx, double dy) { x += dx; y += dy; } // 旋转,angle为角度制 void Rotate(double angle) { double rad = angle * M_PI / 180.0; double sinA = sin(rad); double cosA = cos(rad); double newX = x * cosA - y * sinA; double newY = x * sinA + y * cosA; x = newX; y = newY; } // 缩放 void Scale(double ratioX, double ratioY) { x *= ratioX; y *= ratioY; } }; // 定义一个绘图类 class CMyView : public CView { public: // 绘制函数 void OnDraw(CDC* pDC) { // 创建一个矩形 CRect rect(10, 10, 100, 100); // 平移矩形 rect.OffsetRect(50, 50); // 旋转矩形 CPoint2D center((rect.left + rect.right) / 2.0, (rect.top + rect.bottom) / 2.0); for (int i = 0; i < 4; i++) { CPoint2D point(rect.left + i * (rect.Width() / 3.0), rect.top); point.Translate(-center.x, -center.y); point.Rotate(30); point.Translate(center.x, center.y); rect.SetRect(point.x, point.y, point.x + rect.Width() / 3.0, point.y + rect.Height()); pDC->Rectangle(rect); } // 缩放矩形 rect.DeflateRect(20, 20); rect.right *= 2; rect.bottom *= 2; pDC->Rectangle(rect); } }; ``` 在这个示例中,我们创建了一个CPoint2D类来表示二维坐标点,并实现了平移、旋转和缩放等基本几何变换。然后在CMyView类的OnDraw函数中,我们通过调用MFC提供的平移、旋转和缩放函数,对一个矩形进行了几何变换,并使用pDC->Rectangle函数来绘制变换后的矩形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值