D3DXVec2BaryCentric 函数

D3DXVec2BaryCentric 函数

找出三个2-D坐标向量的重心。

定义:

参数:

pOut

[out, retval]指向 D3DXVECTOR2 结构的操作结果。

pV1

[in]指向 D3DXVECTOR2 结构源向量。

pV2

[in]指向 D3DXVECTOR2 结构源向量。

pV3

[in]指向 D3DXVECTOR2 结构源向量。

f

[in]权重因数,看说明。

g

[in]权重因数,看说明。

返回值:

指向 D3DXVECTOR2 结构的重心坐标向量。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

说明:

D3DXVec2BaryCentric 函数提供一个方法知道三角形的三个点是怎么样分布和它们的相互关系。它是用下面的公式来计算:V1 + f(V2-V1) + g(V3-V1)。

在平面V1V2V3里的任何点都可以用重心坐标 ( f,g)来表示。参数f 是用来表示V2 有多少重量,参数 g 是用来表示V3 有多少重量。最后1- f- g 是用来表示V1 有多少重量。

注意到下面的关系:

· If (f>=0 && g>=0 && 1-f-g>=0), 重心在 V1V2V3三角形内。

· If (f==0 && g>=0 && 1-f-g>=0), 重心在直线V1V3上。

· If (f>=0 && g==0 && 1-f-g>=0), 重心在直线V1V2上。

· If (f>=0 && g>=0 && 1-f-g==0), 重心在直线 V2V3上。

重心坐标是一般的坐标,在这里是用重心坐标来表示系统坐标的变化。在笛卡尔坐标怎么样表示,重心坐标就是怎么样表示。

函数返回值跟pOut 参数返回值是一样的。这样可以让函数D3DXVec2BaryCentric作为其它函数的参数使用。

函数信息:

Header

d3dx9math.h

Import library

d3dx9.lib

Minimum operating systems

Windows98


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gouraud明暗处理是一种基于顶点的着色技术,它通过对三角形顶点的颜色进行插值,来实现对三角形内部像素的着色。下面是使用MFC实现Gouraud明暗处理的示例代码: 1. 定义顶点结构体 ```cpp struct Vertex { float x, y, z; // 顶点坐标 float nx, ny, nz; // 顶点法向量 COLORREF color; // 顶点颜色 }; ``` 2. 定义三角形结构体 ```cpp struct Triangle { Vertex v1, v2, v3; // 三角形的三个顶点 }; ``` 3. 实现Gouraud明暗处理函数 ```cpp void GouraudShading(CDC* pDC, Triangle triangle) { // 计算三角形三个顶点的颜色 COLORREF c1 = triangle.v1.color; COLORREF c2 = triangle.v2.color; COLORREF c3 = triangle.v3.color; // 计算三角形三个顶点的法向量 D3DXVECTOR3 n1(triangle.v1.nx, triangle.v1.ny, triangle.v1.nz); D3DXVECTOR3 n2(triangle.v2.nx, triangle.v2.ny, triangle.v2.nz); D3DXVECTOR3 n3(triangle.v3.nx, triangle.v3.ny, triangle.v3.nz); // 计算三角形三个顶点的屏幕坐标 CPoint p1(triangle.v1.x, triangle.v1.y); CPoint p2(triangle.v2.x, triangle.v2.y); CPoint p3(triangle.v3.x, triangle.v3.y); // 计算三角形三个顶点到对应边界的向量 D3DXVECTOR2 v1(p2.x - p1.x, p2.y - p1.y); D3DXVECTOR2 v2(p3.x - p1.x, p3.y - p1.y); D3DXVECTOR2 v3(p3.x - p2.x, p3.y - p2.y); // 计算三角形的面积 float area = v1.x * v2.y - v2.x * v1.y; // 计算三角形每个像素的颜色 for (int y = min(p1.y, min(p2.y, p3.y)); y <= max(p1.y, max(p2.y, p3.y)); y++) { for (int x = min(p1.x, min(p2.x, p3.x)); x <= max(p1.x, max(p2.x, p3.x)); x++) { CPoint p(x, y); D3DXVECTOR2 vp(p.x - p1.x, p.y - p1.y); // 判断像素是否在三角形内部 float t1 = (vp.x * v2.y - vp.y * v2.x) / area; if (t1 < 0 || t1 > 1) continue; float t2 = (v1.x * vp.y - v1.y * vp.x) / area; if (t2 < 0 || t2 > 1) continue; float t3 = 1 - t1 - t2; if (t3 < 0 || t3 > 1) continue; // 计算像素的颜色 D3DXVECTOR3 n = t1 * n1 + t2 * n2 + t3 * n3; COLORREF c = RGB(t1 * GetRValue(c1) + t2 * GetRValue(c2) + t3 * GetRValue(c3), t1 * GetGValue(c1) + t2 * GetGValue(c2) + t3 * GetGValue(c3), t1 * GetBValue(c1) + t2 * GetBValue(c2) + t3 * GetBValue(c3)); float intensity = max(0.0f, D3DXVec3Dot(&n, &D3DXVECTOR3(0, 0, 1))); c = RGB(intensity * GetRValue(c), intensity * GetGValue(c), intensity * GetBValue(c)); // 绘制像素 pDC->SetPixel(x, y, c); } } } ``` 4. 调用Gouraud明暗处理函数 ```cpp Triangle triangle = { {100, 100, 0, 0, 0, 1, RGB(255, 0, 0)}, // v1 {200, 100, 0, 0, 0, 1, RGB(0, 255, 0)}, // v2 {150, 200, 0, 0, 0, 1, RGB(0, 0, 255)} // v3 }; GouraudShading(pDC, triangle); ``` 上面的代码演示了如何使用MFC实现Gouraud明暗处理,其中主要的计算部分使用了Direct3D的向量库D3DX,通过计算颜色插值和法向量插值,实现了对三角形内部像素的插值处理,并根据像素的法向量计算出明暗度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值