跳转至内容

游戏开发指南/理论/游戏逻辑/创建一个 Vector3 类

75% developed
来自维基教科书,面向开放世界开放书籍

以下是一个用 C++ 编写可能存在的 Vector3 类的大纲

Vector3.h

class Vector3
{
public:
	float x, y, z;

	//Presets

	static const Vector3 Null;
	static const Vector3 Up;
	static const Vector3 Down;
	static const Vector3 Left;
	static const Vector3 Right;
	static const Vector3 Forwards;
	static const Vector3 Backwards;

	//Constructors

	Vector3();
	Vector3(float x, float y, float z);

	void ToArray(float* coords);           //Fills the passed in array with the vector information. [0] = x, [1] = y, [2] = z
	float Length();                        //Finds the magnitude of the vector
	float LengthSqr();                     //Uses less resources, can be used for comparisons, finds the square of the length

	//Operator overloading

	Vector3 operator+(Vector3 v);
	Vector3 operator-(Vector3 v);
	void operator+=(Vector3 v);
	void operator-=(Vector3 v);
	Vector3 operator*(int s);
	Vector3 operator/(int s);
	void operator*=(int s);
	void operator/=(int s);

	//Dot product, angle between and cross product

	float Dot(Vector3 v);	                //Dot product with self and other vector
	float Dot(Vector3 a, Vector3 b);	//Dot product with two vectors
	float FindAngle(Vector3 v);	        //Find the angle between between self another vector
	float FindAngle(Vector3 a, Vector3 b);	//Find the angle between two vectors
	Vector3 Cross(Vector3 a, Vector3 b);	//Cross product with two vectors
	Vector3 Cross(Vector3 v);	        //Cross product with self and other vector
};

Vector3.cpp

#include <cmath>
#include "Vector3.h"

const Vector3 Vector3::Null;
const Vector3 Vector3::Up(0,1,0);
const Vector3 Vector3::Down(0,-1,0);
const Vector3 Vector3::Left(1,0,0);
const Vector3 Vector3::Right(-1,0,0);
const Vector3 Vector3::Forwards(0,0,1);
const Vector3 Vector3::Backwards(0,0,-1);



Vector3::Vector3(){

}

Vector3::Vector3(float x, float y, float z){
	Vector3::x = x;
	Vector3::y = y;
	Vector3::z = z;
}



void Vector3::ToArray(float* coords){
	coords[0] = x;
	coords[1] = y;
	coords[2] = z;
}
float Vector3::Length(){
	return sqrtf(pow(x,2)+pow(y,2)+pow(z,2));
}
float Vector3::LengthSqr(){ 
	return pow(x,2)+pow(y,2)+pow(z,2);
}



Vector3 Vector3::operator+(Vector3 v){
	Vector3 ret(x + v.x, y + v.y, z + v.z);
	return ret;
}
Vector3 Vector3::operator-(Vector3 v){
	Vector3 ret(x - v.x, y - v.y, z - v.z);
	return ret;
}
void Vector3::operator+=(Vector3 v){
	*this = *this + v;  //Calling it's own + overload
}
void Vector3::operator-=(Vector3 v){
	*this = *this - v;  //Calling it's own - overload
}
Vector3 Vector3::operator*(int s){
	Vector3 ret(x*s, y*s, z*s);
	return ret;
}
Vector3 Vector3::operator/(int s){
	Vector3 ret(x/s, y/s, z/s);
	return ret;
}
void Vector3::operator*=(int s){
	*this = *this * s;  //Calling it's own * overload
}
void Vector3::operator/=(int s){
	*this = *this / s;  //Calling it's own / overload
}



float Vector3::Dot(Vector3 v){
	return x*v.x + y+v.y + z*v.z;
}
float Vector3::Dot(Vector3 a, Vector3 b){
	return a.x*b.x + a.y+b.y + a.z*b.z;
}
float Vector3::FindAngle(Vector3 v){
	return (this->Dot(v))/(float)(this->Length() * v.Length());
}
float Vector3::FindAngle(Vector3 a,Vector3 b){
	return (a.Dot(b))/(float)(a.Length() * b.Length());
}
Vector3 Vector3::Cross(Vector3 a, Vector3 b){
	Vector3 c(
			a.y*b.z-a.z*b.y,
			a.z*b.x-a.x*b.z,
			a.x*b.y-a.y*b.x);
	return c;
}
Vector3 Vector3::Cross(Vector3 v){
	Vector3 c(
			y*v.z-z*v.y,
			z*v.x-x*v.z,
			x*v.y-y*v.x);
	return c;
}


Clipboard

待办事项

  • 添加与矩阵的交互
华夏公益教科书