fix quaternion_for_unit_vectors, quaternion_normalised
RotateFree got lower (realistic) sensitivity
This commit is contained in:
parent
0a4d325f85
commit
e1bc4a8ba9
|
|
@ -46,7 +46,8 @@ inline void quaternion_multiply_by_quaternion( Quaternion& quaternion, const Qua
|
|||
}
|
||||
|
||||
/// \brief Constructs a quaternion which rotates between two points on the unit-sphere, \p from and \p to.
|
||||
inline Quaternion quaternion_for_unit_vectors( const Vector3& from, const Vector3& to ){
|
||||
/// warning: wrong math!
|
||||
inline Quaternion quaternion_for_sphere_vectors( const Vector3& from, const Vector3& to ){
|
||||
return Quaternion( vector3_cross( from, to ), static_cast<float>( vector3_dot( from, to ) ) );
|
||||
}
|
||||
|
||||
|
|
@ -80,7 +81,7 @@ inline void quaternion_conjugate( Quaternion& quaternion ){
|
|||
}
|
||||
|
||||
inline Quaternion quaternion_normalised( const Quaternion& quaternion ){
|
||||
const double n = ( 1.0 / ( quaternion[0] * quaternion[0] + quaternion[1] * quaternion[1] + quaternion[2] * quaternion[2] + quaternion[3] * quaternion[3] ) );
|
||||
const double n = ( 1.0 / sqrt( quaternion[0] * quaternion[0] + quaternion[1] * quaternion[1] + quaternion[2] * quaternion[2] + quaternion[3] * quaternion[3] ) );
|
||||
return Quaternion(
|
||||
static_cast<float>( quaternion[0] * n ),
|
||||
static_cast<float>( quaternion[1] * n ),
|
||||
|
|
@ -93,6 +94,11 @@ inline void quaternion_normalise( Quaternion& quaternion ){
|
|||
quaternion = quaternion_normalised( quaternion );
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline Quaternion quaternion_for_unit_vectors( const BasicVector3<T>& from, const BasicVector3<T>& to ){
|
||||
return quaternion_normalised( Quaternion( vector3_cross( from, to ), 1.0 + vector3_dot( from, to ) ) );
|
||||
}
|
||||
|
||||
/// \brief Constructs a pure-rotation matrix from \p quaternion.
|
||||
inline Matrix4 matrix4_rotation_for_quaternion( const Quaternion& quaternion ){
|
||||
#if 0
|
||||
|
|
|
|||
|
|
@ -258,6 +258,7 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const
|
|||
|
||||
vector3_normalise( current );
|
||||
m_rotatable.rotate( quaternion_for_unit_vectors( m_start, current ) );
|
||||
// m_rotatable.rotate( quaternion_for_sphere_vectors( m_start, current ) ); //wrong math, 2x more sensitive
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -3016,7 +3017,7 @@ inline const rect_t SelectionBoxForArea( const float device_point[2], const floa
|
|||
selection_box.max[1] = ( device_delta[1] > 0 ) ? ( device_point[1] + device_delta[1] ) : ( device_point[1] );
|
||||
return selection_box;
|
||||
}
|
||||
|
||||
#if 0
|
||||
Quaternion construct_local_rotation( const Quaternion& world, const Quaternion& localToWorld ){
|
||||
return quaternion_normalised( quaternion_multiplied_by_quaternion(
|
||||
quaternion_normalised( quaternion_multiplied_by_quaternion(
|
||||
|
|
@ -3026,7 +3027,7 @@ Quaternion construct_local_rotation( const Quaternion& world, const Quaternion&
|
|||
localToWorld
|
||||
) );
|
||||
}
|
||||
|
||||
#endif
|
||||
inline void matrix4_assign_rotation( Matrix4& matrix, const Matrix4& other ){
|
||||
matrix[0] = other[0];
|
||||
matrix[1] = other[1];
|
||||
|
|
|
|||
|
|
@ -1492,31 +1492,12 @@ void Face_setTexture_Seamless( Face& face, const char* shader, const TextureProj
|
|||
face.SetFlags( flags );
|
||||
return;
|
||||
}
|
||||
Quaternion rotation = Quaternion( vector3_cross( g_faceTextureClipboard.m_plane.normal(), face.getPlane().plane3().normal() ),
|
||||
static_cast<float>( 1.0 + vector3_dot( g_faceTextureClipboard.m_plane.normal(), face.getPlane().plane3().normal() ) ) );
|
||||
//Quaternion rotation = quaternion_for_unit_vectors( g_faceTextureClipboard.m_plane.normal(), face.getPlane().plane3().normal() );
|
||||
//rotation.w() = sqrt( vector3_length_squared( g_faceTextureClipboard.m_plane.normal() ) * vector3_length_squared( face.getPlane().plane3().normal() ) ) + vector3_dot( g_faceTextureClipboard.m_plane.normal(), face.getPlane().plane3().normal() );
|
||||
//globalOutputStream() << "rotation: " << rotation.x() << " " << rotation.y() << " " << rotation.z() << " " << rotation.w() << " " << "\n";
|
||||
//quaternion_normalise( rotation );
|
||||
const double n = ( 1.0 / sqrt( rotation[0] * rotation[0] + rotation[1] * rotation[1] + rotation[2] * rotation[2] + rotation[3] * rotation[3] ) );
|
||||
rotation = Quaternion(
|
||||
static_cast<float>( rotation[0] * n ),
|
||||
static_cast<float>( rotation[1] * n ),
|
||||
static_cast<float>( rotation[2] * n ),
|
||||
static_cast<float>( rotation[3] * n )
|
||||
);
|
||||
|
||||
const Quaternion rotation = quaternion_for_unit_vectors( g_faceTextureClipboard.m_plane.normal(), face.getPlane().plane3().normal() );
|
||||
// globalOutputStream() << "rotation: " << rotation.x() << " " << rotation.y() << " " << rotation.z() << " " << rotation.w() << " " << "\n";
|
||||
Matrix4 transform = g_matrix4_identity;
|
||||
matrix4_pivoted_rotate_by_quaternion( transform, rotation, line.origin );
|
||||
// Matrix4 transform = matrix4_rotation_for_quaternion_quantised( rotation );
|
||||
// Vector3 translation;
|
||||
// translation_for_pivoted_matrix_transform( translation, transform, line.origin );
|
||||
// transform.tx() = translation.x();
|
||||
// transform.ty() = translation.y();
|
||||
// transform.tz() = translation.z();
|
||||
|
||||
|
||||
//globalOutputStream() << "transform: " << transform << "\n";
|
||||
TextureProjection proj = projection;
|
||||
proj.m_brushprimit_texdef.addScale( g_faceTextureClipboard.m_width, g_faceTextureClipboard.m_height );
|
||||
Texdef_transformLocked( proj, g_faceTextureClipboard.m_width, g_faceTextureClipboard.m_height, g_faceTextureClipboard.m_plane, transform, line.origin );
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user