llheadrotmotion.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:17k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llheadrotmotion.cpp
  3.  * @brief Implementation of LLHeadRotMotion class.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. //-----------------------------------------------------------------------------
  33. // Header Files
  34. //-----------------------------------------------------------------------------
  35. #include "linden_common.h"
  36. #include "llheadrotmotion.h"
  37. #include "llcharacter.h"
  38. #include "llrand.h"
  39. #include "m3math.h"
  40. #include "v3dmath.h"
  41. #include "llcriticaldamp.h"
  42. //-----------------------------------------------------------------------------
  43. // Constants
  44. //-----------------------------------------------------------------------------
  45. const F32 TORSO_LAG = 0.35f; // torso rotation factor
  46. const F32 NECK_LAG = 0.5f; // neck rotation factor
  47. const F32 HEAD_LOOKAT_LAG_HALF_LIFE = 0.15f; // half-life of lookat targeting for head
  48. const F32 TORSO_LOOKAT_LAG_HALF_LIFE = 0.27f; // half-life of lookat targeting for torso
  49. const F32 EYE_LOOKAT_LAG_HALF_LIFE = 0.06f; // half-life of lookat targeting for eye
  50. const F32 HEAD_ROTATION_CONSTRAINT = F_PI_BY_TWO * 0.8f; // limit angle for head rotation
  51. const F32 MIN_HEAD_LOOKAT_DISTANCE = 0.3f; // minimum distance from head before we turn to look at it
  52. const F32 MAX_TIME_DELTA = 2.f; //max two seconds a frame for calculating interpolation
  53. const F32 EYE_JITTER_MIN_TIME = 0.3f; // min amount of time between eye "jitter" motions
  54. const F32 EYE_JITTER_MAX_TIME = 2.5f; // max amount of time between eye "jitter" motions
  55. const F32 EYE_JITTER_MAX_YAW = 0.08f; // max yaw of eye jitter motion
  56. const F32 EYE_JITTER_MAX_PITCH = 0.015f; // max pitch of eye jitter motion
  57. const F32 EYE_LOOK_AWAY_MIN_TIME = 5.f; // min amount of time between eye "look away" motions
  58. const F32 EYE_LOOK_AWAY_MAX_TIME = 15.f; // max amount of time between eye "look away" motions
  59. const F32 EYE_LOOK_BACK_MIN_TIME = 1.f; // min amount of time before looking back after looking away
  60. const F32 EYE_LOOK_BACK_MAX_TIME = 5.f; // max amount of time before looking back after looking away
  61. const F32 EYE_LOOK_AWAY_MAX_YAW = 0.15f; // max yaw of eye look away motion
  62. const F32 EYE_LOOK_AWAY_MAX_PITCH = 0.12f; // max pitch of look away motion
  63. const F32 EYE_ROT_LIMIT_ANGLE = F_PI_BY_TWO * 0.3f; //max angle in radians for eye rotation
  64. const F32 EYE_BLINK_MIN_TIME = 0.5f; // minimum amount of time between blinks
  65. const F32 EYE_BLINK_MAX_TIME = 8.f; // maximum amount of time between blinks
  66. const F32 EYE_BLINK_CLOSE_TIME = 0.03f; // how long the eye stays closed in a blink
  67. const F32 EYE_BLINK_SPEED = 0.015f; // seconds it takes for a eye open/close movement
  68. const F32 EYE_BLINK_TIME_DELTA = 0.005f; // time between one eye starting a blink and the other following
  69. //-----------------------------------------------------------------------------
  70. // LLHeadRotMotion()
  71. // Class Constructor
  72. //-----------------------------------------------------------------------------
  73. LLHeadRotMotion::LLHeadRotMotion(const LLUUID &id) : 
  74. LLMotion(id),
  75. mCharacter(NULL),
  76. mTorsoJoint(NULL),
  77. mHeadJoint(NULL)
  78. {
  79. mName = "head_rot";
  80. mTorsoState = new LLJointState;
  81. mNeckState = new LLJointState;
  82. mHeadState = new LLJointState;
  83. }
  84. //-----------------------------------------------------------------------------
  85. // ~LLHeadRotMotion()
  86. // Class Destructor
  87. //-----------------------------------------------------------------------------
  88. LLHeadRotMotion::~LLHeadRotMotion()
  89. {
  90. }
  91. //-----------------------------------------------------------------------------
  92. // LLHeadRotMotion::onInitialize(LLCharacter *character)
  93. //-----------------------------------------------------------------------------
  94. LLMotion::LLMotionInitStatus LLHeadRotMotion::onInitialize(LLCharacter *character)
  95. {
  96. if (!character)
  97. return STATUS_FAILURE;
  98. mCharacter = character;
  99. mPelvisJoint = character->getJoint("mPelvis");
  100. if ( ! mPelvisJoint )
  101. {
  102. llinfos << getName() << ": Can't get pelvis joint." << llendl;
  103. return STATUS_FAILURE;
  104. }
  105. mRootJoint = character->getJoint("mRoot");
  106. if ( ! mRootJoint )
  107. {
  108. llinfos << getName() << ": Can't get root joint." << llendl;
  109. return STATUS_FAILURE;
  110. }
  111. mTorsoJoint = character->getJoint("mTorso");
  112. if ( ! mTorsoJoint )
  113. {
  114. llinfos << getName() << ": Can't get torso joint." << llendl;
  115. return STATUS_FAILURE;
  116. }
  117. mHeadJoint = character->getJoint("mHead");
  118. if ( ! mHeadJoint )
  119. {
  120. llinfos << getName() << ": Can't get head joint." << llendl;
  121. return STATUS_FAILURE;
  122. }
  123. mTorsoState->setJoint( character->getJoint("mTorso") );
  124. if ( ! mTorsoState->getJoint() )
  125. {
  126. llinfos << getName() << ": Can't get torso joint." << llendl;
  127. return STATUS_FAILURE;
  128. }
  129. mNeckState->setJoint( character->getJoint("mNeck") );
  130. if ( ! mNeckState->getJoint() )
  131. {
  132. llinfos << getName() << ": Can't get neck joint." << llendl;
  133. return STATUS_FAILURE;
  134. }
  135. mHeadState->setJoint( character->getJoint("mHead") );
  136. if ( ! mHeadState->getJoint() )
  137. {
  138. llinfos << getName() << ": Can't get head joint." << llendl;
  139. return STATUS_FAILURE;
  140. }
  141. mTorsoState->setUsage(LLJointState::ROT);
  142. mNeckState->setUsage(LLJointState::ROT);
  143. mHeadState->setUsage(LLJointState::ROT);
  144. addJointState( mTorsoState );
  145. addJointState( mNeckState );
  146. addJointState( mHeadState );
  147. mLastHeadRot.loadIdentity();
  148. return STATUS_SUCCESS;
  149. }
  150. //-----------------------------------------------------------------------------
  151. // LLHeadRotMotion::onActivate()
  152. //-----------------------------------------------------------------------------
  153. BOOL LLHeadRotMotion::onActivate()
  154. {
  155. return TRUE;
  156. }
  157. //-----------------------------------------------------------------------------
  158. // LLHeadRotMotion::onUpdate()
  159. //-----------------------------------------------------------------------------
  160. BOOL LLHeadRotMotion::onUpdate(F32 time, U8* joint_mask)
  161. {
  162. LLQuaternion targetHeadRotWorld;
  163. LLQuaternion currentRootRotWorld = mRootJoint->getWorldRotation();
  164. LLQuaternion currentInvRootRotWorld = ~currentRootRotWorld;
  165. F32 head_slerp_amt = LLCriticalDamp::getInterpolant(HEAD_LOOKAT_LAG_HALF_LIFE);
  166. F32 torso_slerp_amt = LLCriticalDamp::getInterpolant(TORSO_LOOKAT_LAG_HALF_LIFE);
  167. LLVector3* targetPos = (LLVector3*)mCharacter->getAnimationData("LookAtPoint");
  168. if (targetPos)
  169. {
  170. LLVector3 headLookAt = *targetPos;
  171. // llinfos << "Look At: " << headLookAt + mHeadJoint->getWorldPosition() << llendl;
  172. F32 lookatDistance = headLookAt.normVec();
  173. if (lookatDistance < MIN_HEAD_LOOKAT_DISTANCE)
  174. {
  175. targetHeadRotWorld = mPelvisJoint->getWorldRotation();
  176. }
  177. else
  178. {
  179. LLVector3 root_up = LLVector3(0.f, 0.f, 1.f) * currentRootRotWorld;
  180. LLVector3 left(root_up % headLookAt);
  181. // if look_at has zero length, fail
  182. // if look_at and skyward are parallel, fail
  183. //
  184. // Test both of these conditions with a cross product.
  185. if (left.magVecSquared() < 0.15f)
  186. {
  187. LLVector3 root_at = LLVector3(1.f, 0.f, 0.f) * currentRootRotWorld;
  188. root_at.mV[VZ] = 0.f;
  189. root_at.normVec();
  190. headLookAt = lerp(headLookAt, root_at, 0.4f);
  191. headLookAt.normVec();
  192. left = root_up % headLookAt;
  193. }
  194. // Make sure look_at and skyward and not parallel
  195. // and neither are zero length
  196. LLVector3 up(headLookAt % left);
  197. targetHeadRotWorld = LLQuaternion(headLookAt, left, up);
  198. }
  199. }
  200. else
  201. {
  202. targetHeadRotWorld = currentRootRotWorld;
  203. }
  204. LLQuaternion head_rot_local = targetHeadRotWorld * currentInvRootRotWorld;
  205. head_rot_local.constrain(HEAD_ROTATION_CONSTRAINT);
  206. // set final torso rotation
  207. // Set torso target rotation such that it lags behind the head rotation
  208. // by a fixed amount.
  209. LLQuaternion torso_rot_local = nlerp(TORSO_LAG, LLQuaternion::DEFAULT, head_rot_local );
  210. mTorsoState->setRotation( nlerp(torso_slerp_amt, mTorsoState->getRotation(), torso_rot_local) );
  211. head_rot_local = nlerp(head_slerp_amt, mLastHeadRot, head_rot_local);
  212. mLastHeadRot = head_rot_local;
  213. // Set the head rotation.
  214. if(mNeckState->getJoint() && mNeckState->getJoint()->getParent())
  215. {
  216. LLQuaternion torsoRotLocal =  mNeckState->getJoint()->getParent()->getWorldRotation() * currentInvRootRotWorld;
  217. head_rot_local = head_rot_local * ~torsoRotLocal;
  218. mNeckState->setRotation( nlerp(NECK_LAG, LLQuaternion::DEFAULT, head_rot_local) );
  219. mHeadState->setRotation( nlerp(1.f - NECK_LAG, LLQuaternion::DEFAULT, head_rot_local));
  220. }
  221. return TRUE;
  222. }
  223. //-----------------------------------------------------------------------------
  224. // LLHeadRotMotion::onDeactivate()
  225. //-----------------------------------------------------------------------------
  226. void LLHeadRotMotion::onDeactivate()
  227. {
  228. }
  229. //-----------------------------------------------------------------------------
  230. // LLEyeMotion()
  231. // Class Constructor
  232. //-----------------------------------------------------------------------------
  233. LLEyeMotion::LLEyeMotion(const LLUUID &id) : LLMotion(id)
  234. {
  235. mCharacter = NULL;
  236. mEyeJitterTime = 0.f;
  237. mEyeJitterYaw = 0.f;
  238. mEyeJitterPitch = 0.f;
  239. mEyeLookAwayTime = 0.f;
  240. mEyeLookAwayYaw = 0.f;
  241. mEyeLookAwayPitch = 0.f;
  242. mEyeBlinkTime = 0.f;
  243. mEyesClosed = FALSE;
  244. mHeadJoint = NULL;
  245. mName = "eye_rot";
  246. mLeftEyeState = new LLJointState;
  247. mRightEyeState = new LLJointState;
  248. }
  249. //-----------------------------------------------------------------------------
  250. // ~LLEyeMotion()
  251. // Class Destructor
  252. //-----------------------------------------------------------------------------
  253. LLEyeMotion::~LLEyeMotion()
  254. {
  255. }
  256. //-----------------------------------------------------------------------------
  257. // LLEyeMotion::onInitialize(LLCharacter *character)
  258. //-----------------------------------------------------------------------------
  259. LLMotion::LLMotionInitStatus LLEyeMotion::onInitialize(LLCharacter *character)
  260. {
  261. mCharacter = character;
  262. mHeadJoint = character->getJoint("mHead");
  263. if ( ! mHeadJoint )
  264. {
  265. llinfos << getName() << ": Can't get head joint." << llendl;
  266. return STATUS_FAILURE;
  267. }
  268. mLeftEyeState->setJoint( character->getJoint("mEyeLeft") );
  269. if ( ! mLeftEyeState->getJoint() )
  270. {
  271. llinfos << getName() << ": Can't get left eyeball joint." << llendl;
  272. return STATUS_FAILURE;
  273. }
  274. mRightEyeState->setJoint( character->getJoint("mEyeRight") );
  275. if ( ! mRightEyeState->getJoint() )
  276. {
  277. llinfos << getName() << ": Can't get Right eyeball joint." << llendl;
  278. return STATUS_FAILURE;
  279. }
  280. mLeftEyeState->setUsage(LLJointState::ROT);
  281. mRightEyeState->setUsage(LLJointState::ROT);
  282. addJointState( mLeftEyeState );
  283. addJointState( mRightEyeState );
  284. return STATUS_SUCCESS;
  285. }
  286. //-----------------------------------------------------------------------------
  287. // LLEyeMotion::onActivate()
  288. //-----------------------------------------------------------------------------
  289. BOOL LLEyeMotion::onActivate()
  290. {
  291. return TRUE;
  292. }
  293. //-----------------------------------------------------------------------------
  294. // LLEyeMotion::onUpdate()
  295. //-----------------------------------------------------------------------------
  296. BOOL LLEyeMotion::onUpdate(F32 time, U8* joint_mask)
  297. {
  298. // Compute eye rotation.
  299. LLQuaternion target_eye_rot;
  300. LLVector3 eye_look_at;
  301. F32 vergence;
  302. //calculate jitter
  303. if (mEyeJitterTimer.getElapsedTimeF32() > mEyeJitterTime)
  304. {
  305. mEyeJitterTime = EYE_JITTER_MIN_TIME + ll_frand(EYE_JITTER_MAX_TIME - EYE_JITTER_MIN_TIME);
  306. mEyeJitterYaw = (ll_frand(2.f) - 1.f) * EYE_JITTER_MAX_YAW;
  307. mEyeJitterPitch = (ll_frand(2.f) - 1.f) * EYE_JITTER_MAX_PITCH;
  308. // make sure lookaway time count gets updated, because we're resetting the timer
  309. mEyeLookAwayTime -= llmax(0.f, mEyeJitterTimer.getElapsedTimeF32());
  310. mEyeJitterTimer.reset();
  311. else if (mEyeJitterTimer.getElapsedTimeF32() > mEyeLookAwayTime)
  312. {
  313. if (ll_frand() > 0.1f)
  314. {
  315. // blink while moving eyes some percentage of the time
  316. mEyeBlinkTime = mEyeBlinkTimer.getElapsedTimeF32();
  317. }
  318. if (mEyeLookAwayYaw == 0.f && mEyeLookAwayPitch == 0.f)
  319. {
  320. mEyeLookAwayYaw = (ll_frand(2.f) - 1.f) * EYE_LOOK_AWAY_MAX_YAW;
  321. mEyeLookAwayPitch = (ll_frand(2.f) - 1.f) * EYE_LOOK_AWAY_MAX_PITCH;
  322. mEyeLookAwayTime = EYE_LOOK_BACK_MIN_TIME + ll_frand(EYE_LOOK_BACK_MAX_TIME - EYE_LOOK_BACK_MIN_TIME);
  323. }
  324. else
  325. {
  326. mEyeLookAwayYaw = 0.f;
  327. mEyeLookAwayPitch = 0.f;
  328. mEyeLookAwayTime = EYE_LOOK_AWAY_MIN_TIME + ll_frand(EYE_LOOK_AWAY_MAX_TIME - EYE_LOOK_AWAY_MIN_TIME);
  329. }
  330. }
  331. // do blinking
  332. if (!mEyesClosed && mEyeBlinkTimer.getElapsedTimeF32() >= mEyeBlinkTime)
  333. {
  334. F32 leftEyeBlinkMorph = mEyeBlinkTimer.getElapsedTimeF32() - mEyeBlinkTime;
  335. F32 rightEyeBlinkMorph = leftEyeBlinkMorph - EYE_BLINK_TIME_DELTA;
  336. leftEyeBlinkMorph = llclamp(leftEyeBlinkMorph / EYE_BLINK_SPEED, 0.f, 1.f);
  337. rightEyeBlinkMorph = llclamp(rightEyeBlinkMorph / EYE_BLINK_SPEED, 0.f, 1.f);
  338. mCharacter->setVisualParamWeight("Blink_Left", leftEyeBlinkMorph);
  339. mCharacter->setVisualParamWeight("Blink_Right", rightEyeBlinkMorph);
  340. mCharacter->updateVisualParams();
  341. if (rightEyeBlinkMorph == 1.f)
  342. {
  343. mEyesClosed = TRUE;
  344. mEyeBlinkTime = EYE_BLINK_CLOSE_TIME;
  345. mEyeBlinkTimer.reset();
  346. }
  347. }
  348. else if (mEyesClosed)
  349. {
  350. if (mEyeBlinkTimer.getElapsedTimeF32() >= mEyeBlinkTime)
  351. {
  352. F32 leftEyeBlinkMorph = mEyeBlinkTimer.getElapsedTimeF32() - mEyeBlinkTime;
  353. F32 rightEyeBlinkMorph = leftEyeBlinkMorph - EYE_BLINK_TIME_DELTA;
  354. leftEyeBlinkMorph = 1.f - llclamp(leftEyeBlinkMorph / EYE_BLINK_SPEED, 0.f, 1.f);
  355. rightEyeBlinkMorph = 1.f - llclamp(rightEyeBlinkMorph / EYE_BLINK_SPEED, 0.f, 1.f);
  356. mCharacter->setVisualParamWeight("Blink_Left", leftEyeBlinkMorph);
  357. mCharacter->setVisualParamWeight("Blink_Right", rightEyeBlinkMorph);
  358. mCharacter->updateVisualParams();
  359. if (rightEyeBlinkMorph == 0.f)
  360. {
  361. mEyesClosed = FALSE;
  362. mEyeBlinkTime = EYE_BLINK_MIN_TIME + ll_frand(EYE_BLINK_MAX_TIME - EYE_BLINK_MIN_TIME);
  363. mEyeBlinkTimer.reset();
  364. }
  365. }
  366. }
  367. BOOL has_eye_target = FALSE;
  368. LLVector3* targetPos = (LLVector3*)mCharacter->getAnimationData("LookAtPoint");
  369. if (targetPos)
  370. {
  371. LLVector3 skyward(0.f, 0.f, 1.f);
  372. LLVector3 left;
  373. LLVector3 up;
  374. eye_look_at = *targetPos;
  375. has_eye_target = TRUE;
  376. F32 lookAtDistance = eye_look_at.normVec();
  377. left.setVec(skyward % eye_look_at);
  378. up.setVec(eye_look_at % left);
  379. target_eye_rot = LLQuaternion(eye_look_at, left, up);
  380. // convert target rotation to head-local coordinates
  381. target_eye_rot *= ~mHeadJoint->getWorldRotation();
  382. // eliminate any Euler roll - we're lucky that roll is applied last.
  383. F32 roll, pitch, yaw;
  384. target_eye_rot.getEulerAngles(&roll, &pitch, &yaw);
  385. target_eye_rot.setQuat(0.0f, pitch, yaw);
  386. // constrain target orientation to be in front of avatar's face
  387. target_eye_rot.constrain(EYE_ROT_LIMIT_ANGLE);
  388. // calculate vergence
  389. F32 interocular_dist = (mLeftEyeState->getJoint()->getWorldPosition() - mRightEyeState->getJoint()->getWorldPosition()).magVec();
  390. vergence = -atan2((interocular_dist / 2.f), lookAtDistance);
  391. llclamp(vergence, -F_PI_BY_TWO, 0.f);
  392. }
  393. else
  394. {
  395. target_eye_rot = LLQuaternion::DEFAULT;
  396. vergence = 0.f;
  397. }
  398. //RN: subtract 4 degrees to account for foveal angular offset relative to pupil
  399. vergence += 4.f * DEG_TO_RAD;
  400. // calculate eye jitter
  401. LLQuaternion eye_jitter_rot;
  402. // vergence not too high...
  403. if (vergence > -0.05f)
  404. {
  405. //...go ahead and jitter
  406. eye_jitter_rot.setQuat(0.f, mEyeJitterPitch + mEyeLookAwayPitch, mEyeJitterYaw + mEyeLookAwayYaw);
  407. }
  408. else
  409. {
  410. //...or don't
  411. eye_jitter_rot.loadIdentity();
  412. }
  413. // calculate vergence of eyes as an object gets closer to the avatar's head
  414. LLQuaternion vergence_quat;
  415. if (has_eye_target)
  416. {
  417. vergence_quat.setQuat(vergence, LLVector3(0.f, 0.f, 1.f));
  418. }
  419. else
  420. {
  421. vergence_quat.loadIdentity();
  422. }
  423. // calculate eye rotations
  424. LLQuaternion left_eye_rot = target_eye_rot;
  425. left_eye_rot = vergence_quat * eye_jitter_rot * left_eye_rot;
  426. LLQuaternion right_eye_rot = target_eye_rot;
  427. vergence_quat.transQuat();
  428. right_eye_rot = vergence_quat * eye_jitter_rot * right_eye_rot;
  429. mLeftEyeState->setRotation( left_eye_rot );
  430. mRightEyeState->setRotation( right_eye_rot );
  431. return TRUE;
  432. }
  433. //-----------------------------------------------------------------------------
  434. // LLEyeMotion::onDeactivate()
  435. //-----------------------------------------------------------------------------
  436. void LLEyeMotion::onDeactivate()
  437. {
  438. LLJoint* joint = mLeftEyeState->getJoint();
  439. if (joint)
  440. {
  441. joint->setRotation(LLQuaternion::DEFAULT);
  442. }
  443. joint = mRightEyeState->getJoint();
  444. if (joint)
  445. {
  446. joint->setRotation(LLQuaternion::DEFAULT);
  447. }
  448. }
  449. // End