例如,使用D3DXVECTOR3
(一个directX三重浮点数)而不是在函数调用中使用三个浮点数的专家和概念是什么。
所以
Scale(D3DXVECTOR3(1, 1, 1));
而不是
Scale(1, 1, 1);
当您需要使用特定于库的数学函数时,使用第二个并且仅转换为D3DXVECTOR3
是否更好?
我还注意到很多库都有自己的浮点数和双打类型等等。想法?
答案 0 :(得分:1)
让API接受浮动结构而不是浮动本身的一个重要原因是可读性。在任何使用3D图形的应用程序中,您肯定需要使用大量矢量。这更具可读性和可维护性:
D3DXVECTOR Scale(D3DXVECTOR a, double scale)
{
return D3DXVECTOR(a.x * scale, a.y * scale, a.z * scale);
}
class MyClass
{
public:
void DoSomething()
{
a = Scale(b, 2.0);
::D3DXVec3Cross(&out, &a, &b);
}
private:
D3DXVECTOR3 out;
D3DXVECTOR3 a;
D3DXVECTOR3 b;
};
比这个:
class MyClass
{
public:
void DoSomething()
{
float scale = 2.0;
a1 = Scale(b1, scale);
a2 = Scale(b2, scale);
a3 = Scale(b3, scale);
// Hypothetical D3DX function accepting floats directly
::D3DXVec3Cross(&out1, &out2, &out3, a1, a2, a3, b1, b2, b3);
}
private:
float out1;
float out2;
float out3;
float a1;
float a2;
float a3;
float b1;
float b2;
float b3;
};
换句话说,它允许自我记录代码。更不用说在需要声明向量时输入的时间更少(一个D3DXVECTOR
而不是三个单独的float
)。
话虽这么说,通常3D图形库/框架会定义自己的矢量类型和浮点类型,以便跨不同平台和配置实现可移植性。可以简单地定义这些类型如下:
namespace My3DLib
{
typedef MyFloat float;
struct MyVector
{
MyFloat x;
MyFloat y;
MyFloat z;
};
MyVector Scale(MyVector a, MyFloat b);
MyFloat DotProduct(MyVector a, MyVector b);
MyVector CrossProduct(MyVector a, MyVector b);
// ...
}