我目前正在研究一种游戏"引擎",它需要在3D引擎,物理引擎和脚本语言之间移动值.由于我需要经常将物理引擎中的矢量应用到3D对象,并且希望能够通过脚本系统控制3D以及物理对象,我需要一种机制来转换一种类型的矢量(例如vector3d<float>)到另一种类型的向量(例如btVector3).不幸的是,我不能对类/结构的布局做出任何假设,所以一个简单的reinterpret_cast可能不会做.
所以问题是:是否有某种"静态"/非成员投射方法基本上实现:
vector3d<float> operator vector3d<float>(btVector3 vector) {
// convert and return
}
btVector3 operator btVector3(vector3d<float> vector) {
// convert and return
}
Run Code Online (Sandbox Code Playgroud)
现在这不会编译,因为转换操作符需要是成员方法.(error C2801: 'operator foo' must be a non-static member)
我建议将它们编写为一对自由函数(即,不必担心将它们变成“运算符”):
vector3d<float> vector3dFromBt(const btVector3& src) {
// convert and return
}
btVector3 btVectorFrom3d(const vector3d<float>& src) {
// convert and return
}
void f(void)
{
vector3d<float> one;
// ...populate...
btVector3 two(btVectorFrom3d(one));
// ...
vector3d<float> three(vector3dFromBt(two));
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用模板化包装类,例如:
template<class V>
class vector_cast {};
template<>
class vector_cast<vector3d> {
const vector3d& v;
public:
vector_cast(const vector3d& v) : v(v) {};
operator vector3d () const {
return vector3d(v);
}
operator btVector3 () const {
// convert and return
}
};
template<>
class vector_cast<btVector3> {
const btVector3& v;
public:
vector_cast(const btVector3& v) : v(v) {};
operator btVector3 () const {
return btVector3(v);
}
operator vector3d () const {
// convert and return
}
};
Run Code Online (Sandbox Code Playgroud)
用法:
void set_origin(btVector3 v);
// in your code:
vector3d v;
// do some fancy computations
set_origin(vector_cast(v));
// --- OR the other way round --- //
void set_velocity(vector3d v);
// in your code:
btVector3 v;
// do some other computations
set_velocity(vector_cast(v));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7417 次 |
| 最近记录: |