⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 euler.cpp

📁 游戏《家园》源码
💻 CPP
字号:
// Copyright (c) 1999 Relic Entertainment Inc.
// Original code written by Jason Dorie
// Adapted by Janik Joire
//
// $History: $

#include <math.h>
#include <float.h>
#include "euler.h"

Euler::Euler(float X, float Y, float Z, long Order)
{
	x = X;
	y = Y;
	z = Z;
	Ord = Order;
}

/* Construct matrix from Euler angles */
void Euler::ToMatrix(float *M)
{
	long	i,j,k,h,n,s,f;
	float	ci, cj, ch, si, sj, sh, cc, cs, sc, ss, t;

	EulGetOrd(Ord,i,j,k,h,n,s,f);

	if(f == EulFrmR)
	{
		t = x;
		x = z;
		z = t;
	}

	if(n == EulParOdd)
	{
		x = -x;
		y = -y;
		z = -z;
	}

	ci = (float)cos(x); cj = (float)cos(y); ch = (float)cos(z);
	si = (float)sin(x); sj = (float)sin(y); sh = (float)sin(z);
	cc = ci*ch; cs = ci*sh; sc = si*ch; ss = si*sh;

	if(s == EulRepYes)
	{
		M[m(i,i)] = cj;	  M[m(i,j)] =  sj*si;    M[m(i,k)] =  sj*ci;
		M[m(j,i)] = sj*sh;  M[m(j,j)] = -cj*ss+cc; M[m(j,k)] = -cj*cs-sc;
		M[m(k,i)] = -sj*ch; M[m(k,j)] =  cj*sc+cs; M[m(k,k)] =  cj*cc-ss;
	}
	else
	{
		M[m(i,i)] = cj*ch; M[m(i,j)] = sj*sc-cs; M[m(i,k)] = sj*cc+ss;
		M[m(j,i)] = cj*sh; M[m(j,j)] = sj*ss+cc; M[m(j,k)] = sj*cs-sc;
		M[m(k,i)] = -sj;	 M[m(k,j)] = cj*si;    M[m(k,k)] = cj*ci;
	}

	M[m(3,0)] = M[m(3,1)] = M[m(3,2)] = M[m(0,3)] = M[m(1,3)] = M[m(2,3)] = 0.0;
	M[m(3,3)] = 1.0;
}

/* Convert matrix to Euler angles */
void Euler::FromMatrix(float *M, long Order)
{
	long	i,j,k,h,n,s,f;
	float	sy, cy, t;
	float	RadX, RadY, RadZ;

	EulGetOrd(Order,i,j,k,h,n,s,f);

	if(s == EulRepYes)
	{
		sy = (float)sqrt(M[m(i,j)]*M[m(i,j)] + M[m(i,k)]*M[m(i,k)]);
		if(sy > 16*FLT_EPSILON)
		{
			RadX = (float)atan2(M[m(i,j)], M[m(i,k)]);
			RadY = (float)atan2(sy, M[m(i,i)]);
			RadZ = (float)atan2(M[m(j,i)], -M[m(k,i)]);
		}
		else
		{
			RadX = (float)atan2(-M[m(j,k)], M[m(j,j)]);
			RadY = (float)atan2(sy, M[m(i,i)]);
			RadZ = 0.0;
		}
	}
	else
	{
		cy = (float)sqrt(M[m(i,i)]*M[m(i,i)] + M[m(j,i)]*M[m(j,i)]);
		if (cy > 16*FLT_EPSILON)
		{
			RadX = (float)atan2(M[m(k,j)], M[m(k,k)]);
			RadY = (float)atan2(-M[m(k,i)], cy);
			RadZ = (float)atan2(M[m(j,i)], M[m(i,i)]);
		}
		else
		{
			RadX = (float)atan2(-M[m(j,k)], M[m(j,j)]);
			RadY = (float)atan2(-M[m(k,i)], cy);
			RadZ = 0;
		}
	}

	x = RadX;
	y = RadY;
	z = RadZ;

	if(n == EulParOdd)
	{
		x = -x;
		y = -y;
		z = -z;
	}

	if(f == EulFrmR)
	{
		t = x;
		x = z;
		z = t;
	}

	if( (x >= PI) && (z >= PI) )
	{
		x -= PI;
		y = PI - y;
		z -= PI;
	}

	Ord = Order;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -