diff --git a/HandmadeMath.h b/HandmadeMath.h index 5306201..3f7700c 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -1436,6 +1436,12 @@ HMM_EXTERN hmm_quaternion HMM_Slerp(hmm_quaternion Left, float Time, hmm_quatern HMM_EXTERN hmm_mat4 HMM_QuaternionToMat4(hmm_quaternion Left); HMM_EXTERN hmm_quaternion HMM_QuaternionFromAxisAngle(hmm_vec3 Axis, float AngleOfRotation); +HMM_INLINE hmm_quaternion HMM_QuaternionFromVectors(hmm_vec3 Normal, hmm_vec3 Up) +{ + // TODO: zero cases + return HMM_QuaternionFromAxisAngle(HMM_Cross(Up, Normal), HMM_ACosF(HMM_DotVec3(Normal, Up))); +} + #ifdef __cplusplus } #endif diff --git a/example/Axes.blend b/example/Axes.blend new file mode 100644 index 0000000..acadad6 Binary files /dev/null and b/example/Axes.blend differ diff --git a/example/Axes.mtl b/example/Axes.mtl new file mode 100644 index 0000000..c9640bc --- /dev/null +++ b/example/Axes.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'Axes.blend' +# Material Count: 1 + +newmtl None +Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/example/Axes.obj b/example/Axes.obj new file mode 100644 index 0000000..61e393e --- /dev/null +++ b/example/Axes.obj @@ -0,0 +1,481 @@ +# Blender v2.78 (sub 0) OBJ File: 'Axes.blend' +# www.blender.org +mtllib Axes.mtl +o Cylinder.002_Cylinder +v 0.000000 0.080000 -0.000000 +v 0.000000 0.080000 2.000000 +v 0.056569 0.056569 -0.000000 +v 0.056569 0.056569 2.000000 +v 0.080000 -0.000000 0.000000 +v 0.080000 0.000000 2.000000 +v 0.056569 -0.056569 0.000000 +v 0.056569 -0.056568 2.000000 +v -0.000000 -0.080000 0.000000 +v -0.000000 -0.080000 2.000000 +v -0.056569 -0.056569 0.000000 +v -0.056569 -0.056568 2.000000 +v -0.080000 0.000000 -0.000000 +v -0.080000 0.000000 2.000000 +v -0.056569 0.056569 -0.000000 +v -0.056569 0.056569 2.000000 +v 0.000000 0.233061 1.965651 +v 0.089189 0.215320 1.965651 +v 0.164799 0.164799 1.965651 +v 0.215320 0.089189 1.965651 +v 0.233061 0.000000 1.965651 +v 0.000000 0.000000 2.431772 +v 0.215320 -0.089188 1.965651 +v 0.164799 -0.164799 1.965651 +v 0.089189 -0.215320 1.965651 +v 0.000000 -0.233061 1.965651 +v -0.089188 -0.215320 1.965651 +v -0.164799 -0.164799 1.965651 +v -0.215320 -0.089188 1.965651 +v -0.233060 0.000000 1.965651 +v -0.215320 0.089189 1.965651 +v -0.164799 0.164799 1.965651 +v -0.089188 0.215320 1.965651 +vn 0.3827 0.9239 -0.0000 +vn 0.9239 0.3827 -0.0000 +vn 0.9239 -0.3827 0.0000 +vn 0.3827 -0.9239 0.0000 +vn -0.3827 -0.9239 0.0000 +vn -0.9239 -0.3827 0.0000 +vn 0.0000 0.0000 1.0000 +vn -0.9239 0.3827 -0.0000 +vn -0.3827 0.9239 -0.0000 +vn 0.0000 -0.0000 -1.0000 +vn 0.1752 0.8806 0.4403 +vn 0.4988 0.7465 0.4403 +vn 0.7465 0.4988 0.4403 +vn 0.8806 0.1752 0.4403 +vn 0.8806 -0.1752 0.4403 +vn 0.7465 -0.4988 0.4403 +vn 0.4988 -0.7465 0.4403 +vn 0.1752 -0.8806 0.4403 +vn -0.1752 -0.8806 0.4403 +vn -0.4988 -0.7465 0.4403 +vn -0.7465 -0.4988 0.4403 +vn -0.8806 -0.1752 0.4403 +vn -0.8806 0.1752 0.4403 +vn -0.7465 0.4988 0.4403 +vn -0.4988 0.7465 0.4403 +vn -0.1752 0.8806 0.4403 +usemtl None +s off +f 1//1 2//1 4//1 3//1 +f 3//2 4//2 6//2 5//2 +f 5//3 6//3 8//3 7//3 +f 7//4 8//4 10//4 9//4 +f 9//5 10//5 12//5 11//5 +f 11//6 12//6 14//6 13//6 +f 4//7 2//7 16//7 14//7 12//7 10//7 8//7 6//7 +f 13//8 14//8 16//8 15//8 +f 15//9 16//9 2//9 1//9 +f 1//10 3//10 5//10 7//10 9//10 11//10 13//10 15//10 +f 17//11 22//11 18//11 +f 18//12 22//12 19//12 +f 19//13 22//13 20//13 +f 20//14 22//14 21//14 +f 21//15 22//15 23//15 +f 23//16 22//16 24//16 +f 24//17 22//17 25//17 +f 25//18 22//18 26//18 +f 26//19 22//19 27//19 +f 27//20 22//20 28//20 +f 28//21 22//21 29//21 +f 29//22 22//22 30//22 +f 30//23 22//23 31//23 +f 31//24 22//24 32//24 +f 32//25 22//25 33//25 +f 33//26 22//26 17//26 +f 17//10 18//10 19//10 20//10 21//10 23//10 24//10 25//10 26//10 27//10 28//10 29//10 30//10 31//10 32//10 33//10 +o Cylinder.001_Cylinder +v 0.000000 0.000000 -0.080000 +v 0.000000 2.000000 -0.080000 +v 0.056569 0.000000 -0.056569 +v 0.056569 2.000000 -0.056569 +v 0.080000 0.000000 0.000000 +v 0.080000 2.000000 0.000000 +v 0.056569 0.000000 0.056569 +v 0.056569 2.000000 0.056569 +v -0.000000 0.000000 0.080000 +v -0.000000 2.000000 0.080000 +v -0.056569 0.000000 0.056569 +v -0.056569 2.000000 0.056569 +v -0.080000 0.000000 -0.000000 +v -0.080000 2.000000 -0.000000 +v -0.056569 0.000000 -0.056569 +v -0.056569 2.000000 -0.056569 +v 0.000000 1.965651 -0.233061 +v 0.089189 1.965651 -0.215320 +v 0.164799 1.965651 -0.164799 +v 0.215320 1.965651 -0.089188 +v 0.233061 1.965651 0.000000 +v 0.000000 2.431772 0.000000 +v 0.215320 1.965651 0.089188 +v 0.164799 1.965651 0.164799 +v 0.089189 1.965651 0.215320 +v 0.000000 1.965651 0.233061 +v -0.089188 1.965651 0.215320 +v -0.164799 1.965651 0.164799 +v -0.215320 1.965651 0.089188 +v -0.233060 1.965651 -0.000000 +v -0.215320 1.965651 -0.089188 +v -0.164799 1.965651 -0.164799 +v -0.089188 1.965651 -0.215320 +vn 0.3827 0.0000 -0.9239 +vn 0.9239 0.0000 -0.3827 +vn 0.9239 0.0000 0.3827 +vn 0.3827 0.0000 0.9239 +vn -0.3827 0.0000 0.9239 +vn -0.9239 0.0000 0.3827 +vn 0.0000 1.0000 -0.0000 +vn -0.9239 0.0000 -0.3827 +vn -0.3827 0.0000 -0.9239 +vn 0.0000 -1.0000 0.0000 +vn 0.1752 0.4403 -0.8806 +vn 0.4988 0.4403 -0.7465 +vn 0.7465 0.4403 -0.4988 +vn 0.8806 0.4403 -0.1752 +vn 0.8806 0.4403 0.1752 +vn 0.7465 0.4403 0.4988 +vn 0.4988 0.4403 0.7465 +vn 0.1752 0.4403 0.8806 +vn -0.1752 0.4403 0.8806 +vn -0.4988 0.4403 0.7465 +vn -0.7465 0.4403 0.4988 +vn -0.8806 0.4403 0.1752 +vn -0.8806 0.4403 -0.1752 +vn -0.7465 0.4403 -0.4988 +vn -0.4988 0.4403 -0.7465 +vn -0.1752 0.4403 -0.8806 +usemtl None +s off +f 34//27 35//27 37//27 36//27 +f 36//28 37//28 39//28 38//28 +f 38//29 39//29 41//29 40//29 +f 40//30 41//30 43//30 42//30 +f 42//31 43//31 45//31 44//31 +f 44//32 45//32 47//32 46//32 +f 37//33 35//33 49//33 47//33 45//33 43//33 41//33 39//33 +f 46//34 47//34 49//34 48//34 +f 48//35 49//35 35//35 34//35 +f 34//36 36//36 38//36 40//36 42//36 44//36 46//36 48//36 +f 50//37 55//37 51//37 +f 51//38 55//38 52//38 +f 52//39 55//39 53//39 +f 53//40 55//40 54//40 +f 54//41 55//41 56//41 +f 56//42 55//42 57//42 +f 57//43 55//43 58//43 +f 58//44 55//44 59//44 +f 59//45 55//45 60//45 +f 60//46 55//46 61//46 +f 61//47 55//47 62//47 +f 62//48 55//48 63//48 +f 63//49 55//49 64//49 +f 64//50 55//50 65//50 +f 65//51 55//51 66//51 +f 66//52 55//52 50//52 +f 50//36 51//36 52//36 53//36 54//36 56//36 57//36 58//36 59//36 60//36 61//36 62//36 63//36 64//36 65//36 66//36 +o Cylinder +v 0.000000 0.000000 -0.080000 +v 2.000000 0.000000 -0.080000 +v 0.000000 -0.056569 -0.056569 +v 2.000000 -0.056568 -0.056569 +v 0.000000 -0.080000 0.000000 +v 2.000000 -0.080000 0.000000 +v 0.000000 -0.056569 0.056569 +v 2.000000 -0.056568 0.056569 +v -0.000000 0.000000 0.080000 +v 2.000000 0.000000 0.080000 +v -0.000000 0.056569 0.056569 +v 2.000000 0.056569 0.056569 +v -0.000000 0.080000 -0.000000 +v 2.000000 0.080000 -0.000000 +v -0.000000 0.056569 -0.056569 +v 2.000000 0.056569 -0.056569 +v 1.965651 -0.000000 -0.233061 +v 1.965651 -0.089188 -0.215320 +v 1.965651 -0.164799 -0.164799 +v 1.965651 -0.215320 -0.089188 +v 1.965651 -0.233061 0.000000 +v 2.431772 0.000000 0.000000 +v 1.965651 -0.215320 0.089188 +v 1.965651 -0.164799 0.164799 +v 1.965651 -0.089188 0.215320 +v 1.965651 -0.000000 0.233061 +v 1.965651 0.089188 0.215320 +v 1.965651 0.164799 0.164799 +v 1.965651 0.215320 0.089188 +v 1.965651 0.233061 -0.000000 +v 1.965651 0.215320 -0.089188 +v 1.965651 0.164799 -0.164799 +v 1.965651 0.089188 -0.215320 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.3827 0.9239 +vn -0.0000 0.3827 0.9239 +vn -0.0000 0.9239 0.3827 +vn 1.0000 -0.0000 0.0000 +vn -0.0000 0.9239 -0.3827 +vn -0.0000 0.3827 -0.9239 +vn -1.0000 -0.0000 0.0000 +vn 0.4403 -0.1752 -0.8806 +vn 0.4403 -0.4988 -0.7465 +vn 0.4403 -0.7465 -0.4988 +vn 0.4403 -0.8806 -0.1752 +vn 0.4403 -0.8806 0.1752 +vn 0.4403 -0.7465 0.4988 +vn 0.4403 -0.4988 0.7465 +vn 0.4403 -0.1752 0.8806 +vn 0.4403 0.1752 0.8806 +vn 0.4403 0.4988 0.7465 +vn 0.4403 0.7465 0.4988 +vn 0.4403 0.8806 0.1752 +vn 0.4403 0.8806 -0.1752 +vn 0.4403 0.7465 -0.4988 +vn 0.4403 0.4988 -0.7465 +vn 0.4403 0.1752 -0.8806 +usemtl None +s off +f 67//53 68//53 70//53 69//53 +f 69//54 70//54 72//54 71//54 +f 71//55 72//55 74//55 73//55 +f 73//56 74//56 76//56 75//56 +f 75//57 76//57 78//57 77//57 +f 77//58 78//58 80//58 79//58 +f 70//59 68//59 82//59 80//59 78//59 76//59 74//59 72//59 +f 79//60 80//60 82//60 81//60 +f 81//61 82//61 68//61 67//61 +f 67//62 69//62 71//62 73//62 75//62 77//62 79//62 81//62 +f 83//63 88//63 84//63 +f 84//64 88//64 85//64 +f 85//65 88//65 86//65 +f 86//66 88//66 87//66 +f 87//67 88//67 89//67 +f 89//68 88//68 90//68 +f 90//69 88//69 91//69 +f 91//70 88//70 92//70 +f 92//71 88//71 93//71 +f 93//72 88//72 94//72 +f 94//73 88//73 95//73 +f 95//74 88//74 96//74 +f 96//75 88//75 97//75 +f 97//76 88//76 98//76 +f 98//77 88//77 99//77 +f 99//78 88//78 83//78 +f 83//62 84//62 85//62 86//62 87//62 89//62 90//62 91//62 92//62 93//62 94//62 95//62 96//62 97//62 98//62 99//62 +o Text.005 +v 0.778616 0.000000 -3.449000 +v 0.395616 0.000000 -3.449000 +v 0.395616 0.000000 -3.369000 +v 0.623616 0.000000 -3.369000 +v 0.385616 0.000000 -3.000000 +v 0.779616 0.000000 -3.000000 +v 0.779616 0.000000 -3.080000 +v 0.539616 0.000000 -3.080000 +v 0.334616 0.000000 -3.267000 +v 0.091616 0.000000 -3.267000 +v 0.091616 0.000000 -3.174000 +v 0.334616 0.000000 -3.174000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 102//79 100//79 101//79 +f 102//79 103//79 100//79 +f 103//79 107//79 100//79 +f 104//79 107//79 103//79 +f 104//79 106//79 107//79 +f 104//79 105//79 106//79 +f 110//79 108//79 109//79 +f 110//79 111//79 108//79 +o Text.004 +v 1.039616 0.000000 2.551000 +v 0.656616 0.000000 2.551000 +v 0.656616 0.000000 2.631000 +v 0.884616 0.000000 2.631000 +v 0.646616 0.000000 3.000000 +v 1.040616 0.000000 3.000000 +v 1.040616 0.000000 2.920000 +v 0.800616 0.000000 2.920000 +v 0.302616 0.000000 2.411000 +v 0.302616 0.000000 2.606000 +v 0.107616 0.000000 2.606000 +v 0.107616 0.000000 2.688000 +v 0.302616 0.000000 2.688000 +v 0.302616 0.000000 2.883000 +v 0.384616 0.000000 2.883000 +v 0.384616 0.000000 2.688000 +v 0.579616 0.000000 2.688000 +v 0.579616 0.000000 2.606000 +v 0.384616 0.000000 2.606000 +v 0.384616 0.000000 2.411000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +usemtl None +s off +f 114//80 112//80 113//80 +f 114//80 115//80 112//80 +f 115//80 119//80 112//80 +f 116//80 119//80 115//80 +f 116//80 118//80 119//80 +f 116//80 117//80 118//80 +f 121//80 131//80 120//80 +f 121//80 130//80 131//80 +f 123//80 121//80 122//80 +f 123//80 130//80 121//80 +f 123//80 129//80 130//80 +f 123//80 128//80 129//80 +f 124//81 128//81 123//81 +f 125//80 127//80 124//80 +f 127//81 128//81 124//81 +f 125//80 126//80 127//80 +o Text.003 +v 0.812616 -2.551000 -0.000000 +v 0.712616 -2.551000 -0.000000 +v 0.596616 -2.804000 -0.000000 +v 0.475616 -2.551000 -0.000000 +v 0.374616 -2.551000 -0.000000 +v 0.548616 -2.904000 -0.000000 +v 0.395616 -3.230000 0.000000 +v 0.494616 -3.230000 0.000000 +v 0.334616 -2.733000 -0.000000 +v 0.091616 -2.733000 -0.000000 +v 0.091616 -2.826000 -0.000000 +v 0.334616 -2.826000 -0.000000 +vn 0.0000 0.0000 1.0000 +usemtl None +s off +f 137//82 135//82 136//82 +f 137//82 134//82 135//82 +f 134//82 132//82 133//82 +f 134//82 139//82 132//82 +f 137//82 139//82 134//82 +f 138//82 139//82 137//82 +f 142//82 140//82 141//82 +f 142//82 143//82 140//82 +o Text.002 +v 1.073616 3.449000 -0.000000 +v 0.973616 3.449000 -0.000000 +v 0.857616 3.196000 -0.000000 +v 0.736616 3.449000 -0.000000 +v 0.635616 3.449000 -0.000000 +v 0.809616 3.096000 -0.000000 +v 0.656616 2.770000 0.000000 +v 0.755616 2.770000 0.000000 +v 0.302616 3.589000 -0.000000 +v 0.302616 3.394000 -0.000000 +v 0.107616 3.394000 -0.000000 +v 0.107616 3.312000 -0.000000 +v 0.302616 3.312000 -0.000000 +v 0.302616 3.117000 -0.000000 +v 0.384616 3.117000 -0.000000 +v 0.384616 3.312000 -0.000000 +v 0.579616 3.312000 -0.000000 +v 0.579616 3.394000 -0.000000 +v 0.384616 3.394000 -0.000000 +v 0.384616 3.589000 -0.000000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +usemtl None +s off +f 149//83 147//83 148//83 +f 149//83 146//83 147//83 +f 146//83 144//83 145//83 +f 146//83 151//83 144//83 +f 149//83 151//83 146//83 +f 150//83 151//83 149//83 +f 153//83 163//83 152//83 +f 153//83 162//83 163//83 +f 155//83 153//83 154//83 +f 155//83 162//83 153//83 +f 155//83 161//83 162//83 +f 155//83 160//83 161//83 +f 156//84 160//84 155//84 +f 157//83 159//83 156//83 +f 159//83 160//83 156//83 +f 157//83 158//83 159//83 +o Text.001 +v -3.138384 0.000000 -0.449000 +v -3.252384 0.000000 -0.449000 +v -3.380384 0.000000 -0.295000 +v -3.513384 0.000000 -0.449000 +v -3.625384 0.000000 -0.449000 +v -3.436384 0.000000 -0.228000 +v -3.625384 0.000000 0.000000 +v -3.513384 0.000000 0.000000 +v -3.380384 0.000000 -0.161000 +v -3.239384 0.000000 0.000000 +v -3.125384 0.000000 0.000000 +v -3.323384 0.000000 -0.228000 +v -3.665384 0.000000 -0.267000 +v -3.908384 0.000000 -0.267000 +v -3.908384 0.000000 -0.174000 +v -3.665384 0.000000 -0.174000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 169//85 167//85 168//85 +f 169//85 166//85 167//85 +f 166//85 164//85 165//85 +f 166//85 175//85 164//85 +f 169//85 175//85 166//85 +f 170//85 175//85 169//85 +f 170//85 172//85 175//85 +f 172//85 174//85 175//85 +f 170//85 171//85 172//85 +f 173//85 174//85 172//85 +f 178//85 176//85 177//85 +f 178//85 179//85 176//85 +o Text +v 4.122616 0.000000 -0.449000 +v 4.008616 0.000000 -0.449000 +v 3.880616 0.000000 -0.295000 +v 3.747616 0.000000 -0.449000 +v 3.635616 0.000000 -0.449000 +v 3.824616 0.000000 -0.228000 +v 3.635616 0.000000 0.000000 +v 3.747616 0.000000 0.000000 +v 3.880616 0.000000 -0.161000 +v 4.021616 0.000000 0.000000 +v 4.135616 0.000000 0.000000 +v 3.937616 0.000000 -0.228000 +v 3.302616 0.000000 -0.589000 +v 3.302616 0.000000 -0.394000 +v 3.107616 0.000000 -0.394000 +v 3.107616 0.000000 -0.312000 +v 3.302616 0.000000 -0.312000 +v 3.302616 0.000000 -0.117000 +v 3.384616 0.000000 -0.117000 +v 3.384616 0.000000 -0.312000 +v 3.579616 0.000000 -0.312000 +v 3.579616 0.000000 -0.394000 +v 3.384616 0.000000 -0.394000 +v 3.384616 0.000000 -0.589000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +usemtl None +s off +f 185//86 183//86 184//86 +f 185//86 182//86 183//86 +f 182//86 180//86 181//86 +f 182//86 191//86 180//86 +f 185//86 191//86 182//86 +f 186//86 191//86 185//86 +f 186//86 188//86 191//86 +f 188//86 190//86 191//86 +f 186//86 187//86 188//86 +f 189//86 190//86 188//86 +f 193//86 203//86 192//86 +f 193//86 202//86 203//86 +f 195//86 193//86 194//86 +f 195//86 202//86 193//86 +f 195//86 201//86 202//86 +f 195//86 200//86 201//86 +f 196//87 200//87 195//87 +f 197//86 199//86 196//86 +f 199//87 200//87 196//87 +f 197//86 198//86 199//86 diff --git a/example/src/Cube.h b/example/src/Cube.h index 117800c..d0d736b 100644 --- a/example/src/Cube.h +++ b/example/src/Cube.h @@ -147,12 +147,12 @@ public: CubeRenderComponent rc = CubeRenderComponent(); Cube() { - renderComponent = &rc; + // renderComponent = &rc; } void Tick(float deltaSeconds) override { x += deltaSeconds; - position.X = 2.0f * HMM_SINF(x); + // position.X = 2.0f * HMM_SINF(x); rotation *= HMM_QuaternionFromAxisAngle(HMM_Vec3(0.0f, 1.0f, 0.0f), deltaSeconds * HMM_ToRadians(45.0f)); } diff --git a/example/src/FollowCam.h b/example/src/FollowCam.h index 4fb1176..5937b4d 100644 --- a/example/src/FollowCam.h +++ b/example/src/FollowCam.h @@ -6,6 +6,8 @@ #include "Entity.h" #include "HandmadeMath.h" +#include "debug.h" + class FollowCam : public Entity { public: Entity *target; @@ -52,6 +54,58 @@ public: -HMM_ACOSF(HMM_DotVec3(cross, up)) ); } + + printf("Sort of working:\n"); + printQuaternion(rotation); + printVec4(HMM_QuaternionToMat4(rotation) * HMM_Vec4(1.0f, 0.0f, 0.0f, 0.0f)); + printMat4(HMM_QuaternionToMat4(rotation)); + // return; + + hmm_mat4 look = HMM_LookAt(HMM_Vec3(0.0f, 0.0f, 0.0f), HMM_Normalize(target->worldPosition() - worldPosition()), HMM_Vec3(0.0f, 1.0f, 0.0f)); + rotation = HMM_Mat4ToQuaternion(look); + printf("New stuff:\n"); + printQuaternion(rotation); + printVec4(HMM_QuaternionToMat4(rotation) * HMM_Vec4(1.0f, 0.0f, 0.0f, 0.0f)); + printMat4(HMM_QuaternionToMat4(rotation)); + // return; + + rotation = HMM_QuaternionFromVectors(HMM_Vec3(0.001462f, -0.449079f, -0.893491f), HMM_Vec3(0.0f, 1.0f, 0.0f)); + printf("Newer stuff:\n"); + printQuaternion(rotation); + printVec4(HMM_QuaternionToMat4(rotation) * HMM_Vec4(1.0f, 0.0f, 0.0f, 0.0f)); + printMat4(HMM_QuaternionToMat4(rotation)); + // return; + + printf("nighttime genius:\n"); + hmm_vec3 right = HMM_Cross(to, up); + hmm_quaternion tiltUp = HMM_QuaternionFromAxisAngle( + right, + HMM_PI / 2 - HMM_ACosF(HMM_Dot(HMM_Normalize(to), HMM_Normalize(up))) + ); + hmm_vec3 tiltedFwd = (HMM_QuaternionToMat4(tiltUp) * HMM_Vec4v(fwd, 0.0f)).XYZ; + hmm_quaternion pointAt = HMM_QuaternionFromAxisAngle( + HMM_Cross(right, to), + HMM_ACosF(HMM_Dot(HMM_Normalize(tiltedFwd), HMM_Normalize(to))) + ); + rotation = tiltUp * pointAt; + printQuaternion(rotation); + printVec4(HMM_QuaternionToMat4(rotation) * HMM_Vec4(1.0f, 0.0f, 0.0f, 0.0f)); + printMat4(HMM_QuaternionToMat4(rotation)); + // dot products make this bad :( + + // rotate around up vector first? + + // just look, forget the up direction for a bit + hmm_quaternion justPointAt = HMM_QuaternionFromAxisAngle( + HMM_Cross(fwd, to), + HMM_ACosF(HMM_Dot(HMM_Normalize(fwd), HMM_Normalize(to))) + ); + hmm_vec3 newUp = (HMM_QuaternionToMat4(justPointAt) * HMM_Vec4v(up, 0.0f)).XYZ; + hmm_quaternion backUpright = HMM_QuaternionFromAxisAngle( + to, + -HMM_ACosF(HMM_Dot(HMM_Normalize(newUp), HMM_Vec3(0.0f, 1.0f, 0.0f))) + ); + rotation = backUpright * justPointAt; } }; diff --git a/example/src/debug.h b/example/src/debug.h new file mode 100644 index 0000000..18e6ed4 --- /dev/null +++ b/example/src/debug.h @@ -0,0 +1,26 @@ +#include + +#ifndef DEBUG_H +#define DEBUG_H + +#include "HandmadeMath.h" + +void printVec3(hmm_vec3 v) { + printf("%f\t%f\t%f\n", v.X, v.Y, v.Z); +} + +void printVec4(hmm_vec4 v) { + printf("%f\t%f\t%f\t%f\n", v.X, v.Y, v.Z, v.W); +} + +void printQuaternion(hmm_quaternion q) { + printf("%f\t%f\t%f\t%f\n", q.X, q.Y, q.Z, q.W); +} + +void printMat4(hmm_mat4 m) { + for (int r = 0; r < 4; r++) { + printf("| %f\t%f\t%f\t%f |\n", m[0][r], m[1][r], m[2][r], m[3][r]); + } +} + +#endif diff --git a/example/src/main.cpp b/example/src/main.cpp index 5e7a054..339366f 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -75,7 +75,7 @@ int main() monkey.renderComponent = new MeshRenderComponent("MonkeySmooth.obj"); FollowCam cam = FollowCam(&monkey); - // cam.position = HMM_Vec3(3.0f, 3.0f, 4.0f); + // cam.position = HMM_Vec3(-3.0f, -1.0f, 0.0f); cam.position = HMM_Vec3(3.0f, 3.0f, 5.0f); // cam.rotation = HMM_QuaternionFromAxisAngle(HMM_Vec3(0.0f, 1.0f, 0.0f), HMM_ToRadians(90.0f)); @@ -90,6 +90,10 @@ int main() root.AddChild(&c1); root.AddChild(&cam); + Entity axes = Entity(); + axes.renderComponent = new MeshRenderComponent("Axes.obj"); + root.AddChild(&axes); + bool hasTicked = false; high_resolution_clock::time_point lastTickTime;