fix quaternion_for_unit_vectors, quaternion_normalised

RotateFree got lower (realistic) sensitivity
This commit is contained in:
Garux 2018-05-16 02:59:18 +03:00
parent 0a4d325f85
commit e1bc4a8ba9
3 changed files with 14 additions and 26 deletions

View File

@ -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

View File

@ -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];

View File

@ -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 )
);
//globalOutputStream() << "rotation: " << rotation.x() << " " << rotation.y() << " " << rotation.z() << " " << rotation.w() << " " << "\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 );