Я пытался собрать игру в шахматы, используя модель 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();
Что я хотел сделать, так это то, что после того, как модель закончила загрузку, я должен каким-то образом проверить, какой квадрат на доске занимает игровая фигура.Затем, когда фигура выбрана и выбран квадрат «перейти к», найдите x, y, z glTranslate3f, чтобы переместиться в этот центральный квадрат.
Это лучший способ?Похоже, что по ходу игры мне нужно будет хранить glTranslate каждого элемента в отдельности.И когда фигура переходит со 2-го на 3-е место, я должен вычислить glTranslate от исходной начальной точки до 3-го места, верно?
Но как бы вы выяснили, занимает ли игровой элемент квадрат или нети как бы вы выяснили 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, подсчитайте перевод и иди.Я просто не уверен, как рассчитать центр каждого квадрата и выяснить, какие координаты перевода должны быть из квадрата 1 -> квадрат 4.
ИЛИ как определить, какие фигуры занимают какой квадрат с самого начала.Я могу жестко запрограммировать это во время загрузки, но это помогло бы мне лучше понять, если бы был разумный способ сделать это.
Каждая часть квадрата и игры представляет собой структуру 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);
}
public: float 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);
Разница между двумя центрами, перечисленными выше, намного больше.Я делаю что-то неправильно, но не вижу этого.