3d数学

目录标题

  • 1.坐标系
  • 2.三角学
    • 2.1.直角三角形三角函数概念
    • 2.2.角度弧度
    • 2.3.实例
  • 参考

在游戏开发中,需要使用到向量,三角函数之类的知识。

1.坐标系

2d坐标系:x,y

3d坐标系:x,y,z

2.三角学

2.1.直角三角形三角函数概念

3d数学_第1张图片

a:对边
b:邻边
c:斜边

∠ A 为 θ ∠A 为\theta Aθ

s i n ( θ ) = a / c sin(\theta) = a/c sin(θ)=a/c

正弦:对边比斜边。

3d数学_第2张图片

c o s ( θ ) = b / c cos(\theta) = b/c cos(θ)=b/c

余弦:邻边比斜边。

3d数学_第3张图片

t a n ( θ ) = a / b tan(\theta) = a/b tan(θ)=a/b

正切:对边比邻边。

c t a n ( θ ) = b / a ctan(\theta) = b/a ctan(θ)=b/a

余切:邻边比对边。

2.2.角度弧度

弧度数为2πr/r=2π,360°角=2π弧度

radian=angle*(Π/180)

angle = radian*(180/Π)

// Define _USE_MATH_DEFINES before including  to expose these macro
// 工程设置上_USE_MATH_DEFINES
#include 
std::atan2(a.y, a.x)* (180.0 / M_PI)

2.3.实例

#include "mathfu/vector.h"
#include "mathfu/constants.h"
#include 

float radian2angle(float radian) {
     
	return radian * (180.0f / mathfu::kPi);
}

float angle2radian(float angle) {
     
	return angle * (mathfu::kPi / 180.0f);
}

float vector2angle(mathfu::Vector<float, 2> a) {
     
	return std::atan2(a.y, a.x)*(180.0f / mathfu::kPi);
}

void angle2vector(float angle, mathfu::Vector<float, 2>& a) {
     
	auto radian = angle2radian(angle);
	a.y = std::sin(radian);
	a.x = std::cos(radian);
}

void outputvector(const char* tag, mathfu::Vector<float, 2>& a) {
     
	std::cout << tag << "=(" << a.x << "," << a.y << ")\n";
}

// rawBattleCircleFix posSelf: linmath.Vector3{X:11424.3, Y:-311.48605, Z:17336.395}, 
// posEnemy: linmath.Vector3{X:11330.254, Y:-311.48605, Z:17465.838},
// newPos: linmath.Vector3{X:11245.467, Y:-311.48605, Z:17601.525},
// angle: -32, e2sLen: 160.00067
// 测试怪物按照弧形排布在玩家周围
void test_monster_battle_cricle()
{
     
	float dst = 160.0f; // 怪物距离
	float bodyRadius = 80.0f;// 怪物的宽度

	mathfu::Vector<float, 2> monsterPos(11424.3f, 17336.395f);
	mathfu::Vector<float, 2> rolePos(11330.254f, 17465.838f);
	auto dir = monsterPos - rolePos;
	auto angle = vector2angle(dir) + 20.0f;

	mathfu::Vector<float, 2> finalDir;
	angle2vector(angle, finalDir);

	finalDir.x *= dst;
	finalDir.y *= dst;

	mathfu::Vector<float, 2> newPos = rolePos + finalDir;
	
	outputvector("monsterPos", monsterPos);
	outputvector("rolePos", rolePos);
	outputvector("newPos",newPos);
}

cmake定义文件

cmake_minimum_required (VERSION 3.2)
project(math_base)

IF (CMAKE_SYSTEM_NAME MATCHES "Windows")
    add_definitions(-DWIN32)
    add_definitions(-DWIN32_LEAN_AND_MEAN)
    add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    add_definitions(-D_USE_MATH_DEFINES)
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Windows")

include_directories( $ENV{
     MATHFU_PATH}/include )

file(GLOB_RECURSE all_SRC "src/*.cpp" 
    "src/*.hpp" "src/*.h" 
    "src/*.cc" )

add_executable(test_math ${all_SRC})

target_link_libraries(test_math)

计算的位置,在坐标系上的位置

3d数学_第4张图片

参考

  • [1] markdown公式
  • [2] windows10输入公式
  • [3] 三角函数
  • [4] 图形计算器

你可能感兴趣的:(游戏服务器)