-
Notifications
You must be signed in to change notification settings - Fork 2
/
Rotation Arb.h
96 lines (62 loc) · 2.02 KB
/
Rotation Arb.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#pragma once
#include <glm.hpp>
/*
CALCULATES FREE-VECTOR ROTATION ABOUT ANY ARB-IT-RA-RY AXIS IN 2-D PLANE..
*/
#define FROM_ORIGIN 0x0002
#define FREE_VECTOR 0x0001
namespace aRot
{
float mag(glm::vec3 v)
{
// return glm::sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
return glm::sqrt(glm::dot(v,v));
}
/*
@param--
vec :vector to be rotated
pivot :location of pivot in 2 D plane
normal :vector normal to plane of rotation
theta :angle in Degree(not radian !)
*/
glm::vec3 rotatebyPivot(glm::vec3 vec,glm::vec3 pivot,glm::vec3 normal,float theta,bool Normalize=false,int return_as=FREE_VECTOR)
{
float magnitude=mag(vec);
//calculate direction vector..
glm::vec2 tmp(vec);
vec/=magnitude; //direction vector..
//printf("\nvector rot::%f %f %f magnitude :%f",vec.x,vec.y,vec.z,magnitude);
if(Normalize==false) //Normalized operation..
{
if(return_as==FREE_VECTOR) //a free rotated vector...
{
return magnitude*glm::vec3(mag(vec)*glm::cos(glm::radians(theta)),mag((glm::cross(normal,vec)))* glm::sin(glm::radians(theta)) ,0);
}
else if(return_as==FROM_ORIGIN) //or a vector from source of Pivot or generally origin..
return magnitude*(glm::vec3(mag(vec)*glm::cos(glm::radians(theta)),mag((glm::cross(normal,vec)))* glm::sin(glm::radians(theta)) ,0) + pivot);
}
else //Un-normalized operation..
if(return_as==FREE_VECTOR)
return magnitude*glm::vec3(mag(vec)*glm::cos(glm::radians(theta)),mag((glm::cross(normal,vec)))* glm::sin(glm::radians(theta)) ,0);
else if(return_as==FROM_ORIGIN)
return magnitude*(glm::vec3(mag(vec)*glm::cos(glm::radians(theta)),mag((glm::cross(normal,vec)))* glm::sin(glm::radians(theta)) ,0) + pivot);
}
/*
@param
v : input-3d vector
r : output vec-2d imgui(call by ref.)
*/
void glm2Im(glm::vec3 v,ImVec2 &r)
{
r.x=v.x,
r.y=v.y;
}
ImVec2 glm2Im(glm::vec3 v)
{
return ImVec2(v.x,v.y);
}
glm::vec3 Im2glm(ImVec2 src)
{
return (glm::vec3(src.x,src.y,0));
}
};