【发布时间】:2011-01-23 18:16:25
【问题描述】:
我一直在尝试使用 3dsmax 模型拼凑一个国际象棋游戏。至此,我已经能够导入模型,突出显示我有兴趣移动的选定游戏块,并选择我想要移动到的方格。这是当前状态的截图:
http://img26.imageshack.us/img26/9555/chessk.png
黑色圆圈代表我点击的地方,你可以看到棋子去了哪里。我还没有对它应该去哪里做具体的计算。每当我用选定的棋子点击棋盘时,它总是朝同一个方向移动。这是因为刚刚输入了这个虚拟代码开始:
if ( isObjectSelected && isSquareSelected && moveObject )
{
glPushMatrix();
glTranslatef(0.2f, 0.0f, 0.0f); //PLACEHOLDER-DUMMY CODE
}
glDrawElements( GL_TRIANGLES, pMaterial->triangleCount * 3, GL_UNSIGNED_INT, model.getIndexBuffer() + pMaterial->startIndex );
if ( isObjectSelected && isSquareSelected )
glPopMatrix();
我正在考虑做的是在模型加载完成后,以某种方式检查棋子占据棋盘上的哪个方格。 Then, when a piece is selected and a "move to" square is selected, find the x,y,z glTranslate3f to move to that center square.
这是最好的方法吗?似乎随着游戏的进行,我需要单独存储每个部分的 glTranslate。而当一块从它的第 2 点到第 3 点时,我应该计算从原始起点到第 3 点的 glTranslate,对吧?
但是你如何判断一个棋子是否占据一个正方形,你又如何判断两个正方形之间的 glTranslate3f(X, Y, Z) 呢?这是我的 .OBJ 文件中的正方形示例
#
# object Square58
#
v -37.1874 18.6313 80.7864
v -67.0955 18.6313 91.4436
v -56.4384 18.6313 121.3513
v -26.5306 18.6313 110.6938
# 4 vertices
vn 0.0000 1.0000 -0.0000
# 1 vertex normals
vt 0.0000 0.0000 0.0000
# 1 texture coords
我假设我需要找到每个正方形的中心,并说一旦应用程序知道这块在 square1 中,并且您点击了 sqaure4,计算平移并执行。我只是不确定如何计算每个正方形的中心,并从 square1->square4 中找出平移坐标。
或者我将如何确定哪些棋子从一开始就占据哪个方格。我可以在加载过程中对其进行硬编码,但这将帮助我更多地了解是否有一种合理的方式来完成此操作。
每个方块和游戏块都是一个结构体GroupObject,例如:
//A chess piece or square
struct GroupObject
{
std::vector<Material *> materials;
std::string objectName;
std::string groupName;
int index;
std::vector<Vector3 *> vertices;
Vector3 center;
};
Vector3 看起来像:
#ifndef VECTOR3_H
#define VECTOR3_H
#include <math.h>
class Vector3
{
public:
Vector3(float X = 0.0f, float Y = 0.0f, float Z = 0.0f)
{
x = X;
y = Y;
z = Z;
}
Vector3 operator+=(const Vector3 &vec)
{
return (*this = (*this + vec) );
}
Vector3 operator+(const Vector3 &vec)
{
return Vector3(vec.x + x, vec.y + y, vec.z + z);
}
Vector3 operator-=(const Vector3 &vec)
{
return (*this = (*this - vec) );
}
Vector3 operator-(const Vector3 &vec)
{
return Vector3(x - vec.x, y - vec.y, z - vec.z);
}
Vector3 operator*=(float num)
{
return (*this = (*this * num) );
}
Vector3 operator*(float num)
{
return Vector3(x * num, y * num, z * num);
}
Vector3 operator/=(float num)
{
return (*this = (*this / num) );
}
Vector3 operator/(float num)
{
return Vector3(x / num, y / num, z / num);
}
Vector3 operator-(void)
{
//invert direction of vector
return Vector3(-x, -y, -z);
}
float Dot(Vector3 &vec)
{
return (x * vec.x + y * vec.y + z * vec.z);
}
Vector3 operator*(const Vector3 &vec)
{
//cross product
return Vector3( y * vec.z - z * vec.y,
z * vec.x - x * vec.z,
x * vec.y - y * vec.x );
}
float Length(void)
{
//length of vector
return sqrt( x * x + y * y + z * z);
}
Vector3 Normalize(void)
{
float length = Length();
x /= length;
y /= length;
z /= length;
return *this;
}
float Distance(Vector3 &vec)
{
//find distance between two separate vectors
float disX = vec.x - x;
float disY = vec.y - y;
float disZ = vec.z - z;
return sqrt(disX * disX + disY * disY + disZ * disZ);
}
bool operator==(Vector3 &vec)
{
return (vec.x == x && vec.y == y && vec.z == z);
}
bool operator!=(Vector3 &vec)
{
return !(vec == *this);
}
公开: 浮动 x, y, z; };
#endif
我打算用它来存储每个正方形的中心,例如:
Vector3 square->center = X, Y, Z
希望这将有助于它确定移动的位置,以及是否有东西占据了那个空间,但我想我应该得到一些帮助,因为我以前没有这样做过。我也不确定我应该如何计算它,或者仍然完全清楚如何确定一个正方形是否有一个游戏棋子在开始时占据它,或者它是空的。
欢迎任何和所有的帮助。谢谢。
更新
现在我在 3ds max 中看到了一个伙伴,在一个方形对象属性上它说尺寸是 x:40.565 y:40.565
然后我选择了两个正方形,一个在另一个前面。我通过将所有顶点相加并除以顶点的总和来计算每个顶点的中心。我得到了这个:
#square 1
x: 111.12125
y: 18.631268
z: 78.286982
#square 2
x: 82.276817
y: 17.615297
z: 88.545845
但从我原来的例子来看,我能接近移动到正确位置的唯一方法是移动 glTranslatef(0.2f, 0.0f, 0.0f);
上面列出的两个中心之间的差异要大得多。我做错了什么,但没有看到。
【问题讨论】:
-
你的 operator+= 是用 operator+ 定义的。那是倒退。