forked from bartvdbraak/blender
fix [#36093] Stationary Particle system - particle Y axis fails to follow emitter object rotation
This commit is contained in:
parent
791be2f79f
commit
ce172d60ce
@ -1823,35 +1823,75 @@ void psys_get_birth_coordinates(ParticleSimulationData *sim, ParticleData *pa, P
|
|||||||
unit_qt(state->rot);
|
unit_qt(state->rot);
|
||||||
|
|
||||||
if (part->rotmode) {
|
if (part->rotmode) {
|
||||||
|
bool use_global_space;
|
||||||
|
|
||||||
/* create vector into which rotation is aligned */
|
/* create vector into which rotation is aligned */
|
||||||
switch (part->rotmode) {
|
switch (part->rotmode) {
|
||||||
case PART_ROT_NOR:
|
case PART_ROT_NOR:
|
||||||
copy_v3_v3(rot_vec, nor);
|
copy_v3_v3(rot_vec, nor);
|
||||||
|
use_global_space = false;
|
||||||
break;
|
break;
|
||||||
case PART_ROT_VEL:
|
case PART_ROT_VEL:
|
||||||
copy_v3_v3(rot_vec, vel);
|
copy_v3_v3(rot_vec, vel);
|
||||||
|
use_global_space = true;
|
||||||
break;
|
break;
|
||||||
case PART_ROT_GLOB_X:
|
case PART_ROT_GLOB_X:
|
||||||
case PART_ROT_GLOB_Y:
|
case PART_ROT_GLOB_Y:
|
||||||
case PART_ROT_GLOB_Z:
|
case PART_ROT_GLOB_Z:
|
||||||
rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
|
rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
|
||||||
|
use_global_space = true;
|
||||||
break;
|
break;
|
||||||
case PART_ROT_OB_X:
|
case PART_ROT_OB_X:
|
||||||
case PART_ROT_OB_Y:
|
case PART_ROT_OB_Y:
|
||||||
case PART_ROT_OB_Z:
|
case PART_ROT_OB_Z:
|
||||||
copy_v3_v3(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
|
copy_v3_v3(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
|
||||||
|
use_global_space = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
use_global_space = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create rotation quat */
|
/* create rotation quat */
|
||||||
negate_v3(rot_vec);
|
negate_v3(rot_vec);
|
||||||
|
|
||||||
|
if (use_global_space) {
|
||||||
|
/* calculate rotation in global-space */
|
||||||
vec_to_quat(q2, rot_vec, OB_POSX, OB_POSZ);
|
vec_to_quat(q2, rot_vec, OB_POSX, OB_POSZ);
|
||||||
|
|
||||||
/* randomize rotation quat */
|
/* randomize rotation quat */
|
||||||
if (part->randrotfac!=0.0f)
|
if (part->randrotfac != 0.0f) {
|
||||||
interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
|
interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
copy_qt_qt(rot, q2);
|
copy_qt_qt(rot, q2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* calculate rotation in local-space */
|
||||||
|
float q_obmat[4];
|
||||||
|
float q_imat[4];
|
||||||
|
float tvec[3];
|
||||||
|
|
||||||
|
mat4_to_quat(q_obmat, ob->obmat);
|
||||||
|
invert_qt_qt(q_imat, q_obmat);
|
||||||
|
|
||||||
|
copy_v3_v3(tvec, rot_vec);
|
||||||
|
mul_qt_v3(q_imat, tvec);
|
||||||
|
normalize_v3(tvec);
|
||||||
|
vec_to_quat(q2, tvec, OB_POSX, OB_POSZ);
|
||||||
|
|
||||||
|
/* randomize rotation quat */
|
||||||
|
if (part->randrotfac != 0.0f) {
|
||||||
|
mul_qt_qtqt(r_rot, r_rot, q_imat);
|
||||||
|
interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
copy_qt_qt(rot, q2);
|
||||||
|
}
|
||||||
|
|
||||||
|
mul_qt_qtqt(rot, q_obmat, rot);
|
||||||
|
}
|
||||||
|
|
||||||
/* rotation phase */
|
/* rotation phase */
|
||||||
phasefac = part->phasefac;
|
phasefac = part->phasefac;
|
||||||
|
Loading…
Reference in New Issue
Block a user