21 TypeHandle FltTransformRotateScale::_type_handle;
26 FltTransformRotateScale::
28 _center.set(0.0, 0.0, 0.0);
29 _reference_point.set(0.0, 0.0, 0.0);
30 _to_point.set(0.0, 0.0, 0.0);
44 set(
const LPoint3d ¢er,
const LPoint3d &reference_point,
45 const LPoint3d &to_point,
bool axis_scale) {
47 _reference_point = reference_point;
50 LVector3d v1 = _reference_point - _center;
51 LVector3d v2 = _to_point - _center;
54 acos(dot(normalize(v1), normalize(v2))) * 180.0 / MathNumbers::pi;
57 _axis_scale = length(v1);
60 _overall_scale = length(v1);
70 const LPoint3d &FltTransformRotateScale::
78 const LPoint3d &FltTransformRotateScale::
79 get_reference_point()
const {
80 return _reference_point;
86 const LPoint3d &FltTransformRotateScale::
87 get_to_point()
const {
96 return _overall_scale;
118 void FltTransformRotateScale::
120 LVector3d v1 = _reference_point - _center;
121 LVector3d v2 = _to_point - _center;
122 LVector3d rotate_axis = normalize(cross(v1, v2));
127 look_at(r1, v1, rotate_axis, CS_zup_right);
130 LMatrix4d::translate_mat(-_center) *
132 LMatrix4d::scale_mat(1.0, _axis_scale, 1.0) *
133 LMatrix4d::scale_mat(_overall_scale) *
135 LMatrix4d::rotate_mat(_angle, rotate_axis, CS_zup_right) *
136 LMatrix4d::translate_mat(_center);
144 bool FltTransformRotateScale::
146 if (!FltTransformRecord::extract_record(reader)) {
150 nassertr(reader.
get_opcode() == FO_rotate_and_scale,
false);
181 bool FltTransformRotateScale::
183 if (!FltTransformRecord::build_record(writer)) {