work on quat and matrix math - deleted multiple copies of raymath.h causing issues (#1359)

Co-authored-by: codifies <nospam@antispam.com>
This commit is contained in:
chriscamacho 2020-08-23 20:01:26 +01:00 committed by GitHub
parent 816856eb75
commit d140dc81c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 190 additions and 4492 deletions

View File

@ -267,7 +267,8 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),LINUX)
# Reset everything.
# Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
#INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/release/include -I$(RAYLIB_PATH)/src/external
endif
endif
@ -290,7 +291,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),LINUX)
# Reset everything.
# Precedence: immediately local, installed version, raysan5 provided libs
LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)
endif
endif
@ -378,7 +379,8 @@ CORE = \
core/core_scissor_test \
core/core_storage_values \
core/core_vr_simulator \
core/core_loading_thread
core/core_loading_thread \
core/core_quat_conversion
SHAPES = \
shapes/shapes_basic_shapes \

View File

@ -0,0 +1,131 @@
/*******************************************************************************************
*
* raylib [core] example - quat conversions
*
* Welcome to raylib!
*
* generally you should really stick to eulers OR quats...
* This tests that various conversions are equivilant.
*
* You can find all basic examples on [C:\raylib\raylib\examples] directory and
* raylib official webpage: [www.raylib.com]
*
* Enjoy using raylib. :)
*
* This example has been created using raylib 1.0 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
* Copyright (c) 2013-2020 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
#include "raylib.h"
#include "raymath.h"
#ifndef PI2
#define PI2 PI*2
#endif
int main(void)
{
// Initialization
//--------------------------------------------------------------------------------------
const int screenWidth = 800;
const int screenHeight = 450;
InitWindow(screenWidth, screenHeight, "raylib [core] example - quat conversions");
Camera3D camera = { 0 };
camera.position = (Vector3){ 0.0f, 10.0f, 10.0f }; // Camera position
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
camera.fovy = 45.0f; // Camera field-of-view Y
camera.type = CAMERA_PERSPECTIVE; // Camera mode type
Mesh msh = GenMeshCylinder(.2, 1, 32);
Model mod = LoadModelFromMesh(msh);
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
Quaternion q1;
Matrix m1,m2,m3,m4;
Vector3 v1,v2;
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
if (!IsKeyDown(KEY_SPACE)) {
v1.x += 0.01;
v1.y += 0.03;
v1.z += 0.05;
}
if (v1.x > PI2) v1.x-=PI2;
if (v1.y > PI2) v1.y-=PI2;
if (v1.z > PI2) v1.z-=PI2;
q1 = QuaternionFromEuler(v1.x, v1.y, v1.z);
m1 = MatrixRotateZYX(v1);
m2 = QuaternionToMatrix(q1);
q1 = QuaternionFromMatrix(m1);
m3 = QuaternionToMatrix(q1);
v2 = QuaternionToEuler(q1);
v2.x*=DEG2RAD; v2.y*=DEG2RAD; v2.z*=DEG2RAD;
m4 = MatrixRotateZYX(v2);
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode3D(camera);
mod.transform = m1;
DrawModel(mod, (Vector3){-1,0,0},1.0,RED);
mod.transform = m2;
DrawModel(mod, (Vector3){1,0,0},1.0,RED);
mod.transform = m3;
DrawModel(mod, (Vector3){0,0,0},1.0,RED);
mod.transform = m4;
DrawModel(mod, (Vector3){0,0,-1},1.0,RED);
DrawGrid(10, 1.0f);
EndMode3D();
if (v2.x<0) v2.x+=PI2;
if (v2.y<0) v2.y+=PI2;
if (v2.z<0) v2.z+=PI2;
Color cx,cy,cz;
cx=cy=cz=BLACK;
if (v1.x == v2.x) cx = GREEN;
if (v1.y == v2.y) cy = GREEN;
if (v1.z == v2.z) cz = GREEN;
DrawText(TextFormat("%2.3f",v1.x),20,20,20,cx);
DrawText(TextFormat("%2.3f",v1.y),20,40,20,cy);
DrawText(TextFormat("%2.3f",v1.z),20,60,20,cz);
DrawText(TextFormat("%2.3f",v2.x),200,20,20,cx);
DrawText(TextFormat("%2.3f",v2.y),200,40,20,cy);
DrawText(TextFormat("%2.3f",v2.z),200,60,20,cz);
EndDrawing();
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
CloseWindow(); // Close window and OpenGL context
//--------------------------------------------------------------------------------------
return 0;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -78,6 +78,8 @@
#define PI 3.14159265358979323846
#endif
#ifndef DEG2RAD
#define DEG2RAD (PI/180.0f)
#endif
@ -926,6 +928,8 @@ RMDEF Matrix MatrixRotateZ(float angle)
return result;
}
// Returns scaling matrix
RMDEF Matrix MatrixScale(float x, float y, float z)
{
@ -963,6 +967,17 @@ RMDEF Matrix MatrixMultiply(Matrix left, Matrix right)
return result;
}
// TODO suboptimal should be able to create this matrix in one go
// this is an aditional 3 matrix multiplies!
RMDEF Matrix MatrixRotateZYX(Vector3 v)
{
Matrix result = MatrixRotateZ(v.z);
result = MatrixMultiply(result, MatrixRotateY(v.y));
result = MatrixMultiply(result, MatrixRotateX(v.x));
return result;
}
// Returns perspective projection matrix
RMDEF Matrix MatrixFrustum(double left, double right, double bottom, double top, double near, double far)
{
@ -1297,105 +1312,53 @@ RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to)
}
// Returns a quaternion for a given rotation matrix
RMDEF Quaternion QuaternionFromMatrix(Matrix mat)
RMDEF Quaternion QuaternionFromMatrix(Matrix m)
{
Quaternion result = { 0 };
float trace = MatrixTrace(mat);
if (trace > 0.0f)
{
float s = sqrtf(trace + 1)*2.0f;
float invS = 1.0f/s;
result.w = s*0.25f;
result.x = (mat.m6 - mat.m9)*invS;
result.y = (mat.m8 - mat.m2)*invS;
result.z = (mat.m1 - mat.m4)*invS;
}
else
{
float m00 = mat.m0, m11 = mat.m5, m22 = mat.m10;
if (m00 > m11 && m00 > m22)
{
float s = (float)sqrt(1.0f + m00 - m11 - m22)*2.0f;
float invS = 1.0f/s;
result.w = (mat.m6 - mat.m9)*invS;
result.x = s*0.25f;
result.y = (mat.m4 + mat.m1)*invS;
result.z = (mat.m8 + mat.m2)*invS;
}
else if (m11 > m22)
{
float s = sqrtf(1.0f + m11 - m00 - m22)*2.0f;
float invS = 1.0f/s;
result.w = (mat.m8 - mat.m2)*invS;
result.x = (mat.m4 + mat.m1)*invS;
result.y = s*0.25f;
result.z = (mat.m9 + mat.m6)*invS;
}
else
{
float s = sqrtf(1.0f + m22 - m00 - m11)*2.0f;
float invS = 1.0f/s;
result.w = (mat.m1 - mat.m4)*invS;
result.x = (mat.m8 + mat.m2)*invS;
result.y = (mat.m9 + mat.m6)*invS;
result.z = s*0.25f;
}
}
return result;
Quaternion q;
if ( m.m0 > m.m5 && m.m0 > m.m10 ) {
float s = sqrt( 1.0 + m.m0 - m.m5 - m.m10 ) * 2;
q.x = 0.25 * s;
q.y = (m.m4 + m.m1 ) / s;
q.z = (m.m2 + m.m8 ) / s;
q.w = (m.m9 - m.m6 ) / s;
} else if ( m.m5 > m.m10 ) {
float s = sqrt( 1.0 + m.m5 - m.m0 - m.m10 ) * 2;
q.x = (m.m4 + m.m1 ) / s;
q.y = 0.25 * s;
q.z = (m.m9 + m.m6 ) / s;
q.w = (m.m2 - m.m8 ) / s;
} else {
float s = sqrt( 1.0 + m.m10 - m.m0 - m.m5 ) * 2;
q.x = (m.m2 + m.m8 ) / s;
q.y = (m.m9 + m.m6 ) / s;
q.z = 0.25 * s;
q.w = (m.m4 - m.m1 ) / s;
}
return q;
}
// Returns a matrix for a given quaternion
RMDEF Matrix QuaternionToMatrix(Quaternion q)
{
Matrix result = { 0 };
Matrix m = MatrixIdentity();
float a2=2*(q.x*q.x), b2=2*(q.y*q.y), c2=2*(q.z*q.z); //, d2=2*(q.w*q.w);
float ab=2*(q.x*q.y), ac=2*(q.x*q.z), bc=2*(q.y*q.z);
float ad=2*(q.x*q.w), bd=2*(q.y*q.w), cd=2*(q.z*q.w);
float x = q.x, y = q.y, z = q.z, w = q.w;
m.m0 = 1 - b2 - c2;
m.m1 = ab - cd;
m.m2 = ac + bd;
m.m4 = ab + cd;
m.m5 = 1 - a2 - c2;
m.m6 = bc - ad;
m.m8 = ac - bd;
m.m9 = bc + ad;
m.m10 = 1 - a2 - b2;
float x2 = x + x;
float y2 = y + y;
float z2 = z + z;
float length = QuaternionLength(q);
float lengthSquared = length*length;
float xx = x*x2/lengthSquared;
float xy = x*y2/lengthSquared;
float xz = x*z2/lengthSquared;
float yy = y*y2/lengthSquared;
float yz = y*z2/lengthSquared;
float zz = z*z2/lengthSquared;
float wx = w*x2/lengthSquared;
float wy = w*y2/lengthSquared;
float wz = w*z2/lengthSquared;
result.m0 = 1.0f - (yy + zz);
result.m1 = xy - wz;
result.m2 = xz + wy;
result.m3 = 0.0f;
result.m4 = xy + wz;
result.m5 = 1.0f - (xx + zz);
result.m6 = yz - wx;
result.m7 = 0.0f;
result.m8 = xz - wy;
result.m9 = yz + wx;
result.m10 = 1.0f - (xx + yy);
result.m11 = 0.0f;
result.m12 = 0.0f;
result.m13 = 0.0f;
result.m14 = 0.0f;
result.m15 = 1.0f;
return result;
return m;
}
// Returns rotation quaternion for an angle and axis