Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BU_Screwing.h « NarrowPhaseCollision « Bullet « bullet « extern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 09cf049d2f87d168a4a09d8aa895a405829327c7 (plain)
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
/*
 * Copyright (c) 2005 Erwin Coumans http://www.erwincoumans.com
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies.
 * Erwin Coumans makes no representations about the suitability 
 * of this software for any purpose.  
 * It is provided "as is" without express or implied warranty.
*/

#ifndef B_SCREWING_H
#define B_SCREWING_H


#include <SimdVector3.h>
#include <SimdPoint3.h>
#include <SimdTransform.h>


#define SCREWEPSILON 0.00001f

///BU_Screwing implements screwing motion interpolation.
class BU_Screwing
{
public:

	
	BU_Screwing(const SimdVector3& relLinVel,const SimdVector3& relAngVel);

	~BU_Screwing() {
	};
	
	SimdScalar CalculateF(SimdScalar t) const;
	//gives interpolated position for time in [0..1] in screwing frame

	inline SimdPoint3	InBetweenPosition(const SimdPoint3& pt,SimdScalar t) const
	{
		return SimdPoint3(
		pt.x()*cosf(m_w*t)-pt.y()*sinf(m_w*t),
		pt.x()*sinf(m_w*t)+pt.y()*cosf(m_w*t),
		pt.z()+m_s*CalculateF(t));
	}

	inline SimdVector3	InBetweenVector(const SimdVector3& vec,SimdScalar t) const
	{
		return SimdVector3(
		vec.x()*cosf(m_w*t)-vec.y()*sinf(m_w*t),
		vec.x()*sinf(m_w*t)+vec.y()*cosf(m_w*t),
		vec.z());
	}

	//gives interpolated transform for time in [0..1] in screwing frame
	SimdTransform	InBetweenTransform(const SimdTransform& tr,SimdScalar t) const;

	
	//gives matrix from global frame into screwing frame
	void	LocalMatrix(SimdTransform &t) const;

	inline const SimdVector3& GetU() const {	return m_u;}
	inline const SimdVector3& GetO() const {return m_o;}
	inline const SimdScalar GetS() const{ return m_s;}
	inline const SimdScalar GetW() const { return m_w;}
	
private:
	float		m_w;
	float		m_s;
	SimdVector3 m_u;
	SimdVector3	m_o;
};

#endif //B_SCREWING_H