1
0

autoBlink.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { VRMExpressionManager } from "@pixiv/three-vrm";
  2. import { BLINK_CLOSE_MAX, BLINK_OPEN_MAX } from "./emoteConstants";
  3. /**
  4. * 自動瞬きを制御するクラス
  5. */
  6. export class AutoBlink {
  7. private _expressionManager: VRMExpressionManager;
  8. private _remainingTime: number;
  9. private _isOpen: boolean;
  10. private _isAutoBlink: boolean;
  11. constructor(expressionManager: VRMExpressionManager) {
  12. this._expressionManager = expressionManager;
  13. this._remainingTime = 0;
  14. this._isAutoBlink = true;
  15. this._isOpen = true;
  16. }
  17. /**
  18. * 自動瞬きをON/OFFする。
  19. *
  20. * 目を閉じている(blinkが1の)時に感情表現を入れてしまうと不自然になるので、
  21. * 目が開くまでの秒を返し、その時間待ってから感情表現を適用する。
  22. * @param isAuto
  23. * @returns 目が開くまでの秒
  24. */
  25. public setEnable(isAuto: boolean) {
  26. this._isAutoBlink = isAuto;
  27. // 目が閉じている場合、目が開くまでの時間を返す
  28. if (!this._isOpen) {
  29. return this._remainingTime;
  30. }
  31. return 0;
  32. }
  33. public update(delta: number) {
  34. if (this._remainingTime > 0) {
  35. this._remainingTime -= delta;
  36. return;
  37. }
  38. if (this._isOpen && this._isAutoBlink) {
  39. this.close();
  40. return;
  41. }
  42. this.open();
  43. }
  44. private close() {
  45. this._isOpen = false;
  46. this._remainingTime = BLINK_CLOSE_MAX;
  47. this._expressionManager.setValue("blink", 1);
  48. }
  49. private open() {
  50. this._isOpen = true;
  51. this._remainingTime = BLINK_OPEN_MAX;
  52. this._expressionManager.setValue("blink", 0);
  53. }
  54. }