private void RotateToAngle(NeckTypeStateVer2 param, int boneNum, NeckObjectVer2 bone) { var delta = new Vector2(); delta.x = Mathf.DeltaAngle(0f, bone.neckBone.localEulerAngles.x); delta.y = Mathf.DeltaAngle(0f, bone.neckBone.localEulerAngles.y); angle += delta; float x, y; if (TogglePOV.ClampRotation.Value) { var neckParam = param.aParam[boneNum]; y = Mathf.Clamp(angle.y, neckParam.minBendingAngle, neckParam.maxBendingAngle); x = Mathf.Clamp(angle.x, neckParam.upBendingAngle, neckParam.downBendingAngle); } else { y = angle.y; x = angle.x; } angle -= new Vector2(x, y); float z = bone.neckBone.localEulerAngles.z; bone.neckBone.localRotation = Quaternion.Euler(x, y, z); }
private void RotateToAngle(NeckTypeStateVer2 param, int boneNum, NeckObjectVer2 bone) { Vector2 b = default(Vector2); b.x = Mathf.DeltaAngle(0f, bone.neckBone.localEulerAngles.x); b.y = Mathf.DeltaAngle(0f, bone.neckBone.localEulerAngles.y); angle += b; float x, y; if (clampRotation) { y = Mathf.Clamp(angle.y, param.aParam[boneNum].minBendingAngle, param.aParam[boneNum].maxBendingAngle); x = Mathf.Clamp(angle.x, param.aParam[boneNum].upBendingAngle, param.aParam[boneNum].downBendingAngle); } else { y = angle.y; x = angle.x; } angle -= new Vector2(x, y); float z = bone.neckBone.localEulerAngles.z; bone.neckBone.localRotation = Quaternion.Euler(x, y, z); }
private void UpdateCamera() { if (leftEye == null || rightEye == null) { Restore(); return; } if (!CameraEnabled) { if (Input.GetMouseButton(1)) { GameCursor.Instance.SetCursorLock(true); currentfov = Mathf.Clamp(currentfov + Input.GetAxis("Mouse X") * Time.deltaTime * 30f, 1f, MAXFOV); } else if (Input.GetMouseButton(0) && DragManager.allowCamera) { GameCursor.Instance.SetCursorLock(true); float rateaddspeed = 2.5f; float num = Input.GetAxis("Mouse X") * rateaddspeed; float num2 = Input.GetAxis("Mouse Y") * rateaddspeed; rot += new Vector2(-num2, num) * new Vector2(sensitivityX, sensitivityY).magnitude; } else { GameCursor.Instance.SetCursorLock(false); } } if (Input.GetKeyDown(KeyCode.Semicolon)) { currentfov = TogglePOV.DefaultFov.Value; } if (Input.GetKey(KeyCode.Equals)) { currentfov = Mathf.Max(currentfov - Time.deltaTime * 15f, 1f); } else if (Input.GetKey(KeyCode.RightBracket)) { currentfov = Mathf.Min(currentfov + Time.deltaTime * 15f, 100f); } if (Input.GetKeyDown(KeyCode.UpArrow)) { offset = Mathf.Min(offset + 0.0005f, 2f); if (currentBody.sex == 0) { MALE_OFFSET = offset; } else { FEMALE_OFFSET = offset; } } else if (Input.GetKeyDown(KeyCode.DownArrow)) { offset = Mathf.Max(offset - 0.0005f, -2f); if (currentBody.sex == 0) { MALE_OFFSET = offset; } else { FEMALE_OFFSET = offset; } } Camera.main.fieldOfView = currentfov; Camera.main.nearClipPlane = nearClip; DepthOfField = false; Shield = false; NeckLookControllerVer2 neckLookCtrl = currentBody.neckLookCtrl; NeckLookCalcVer2 neckLookScript = neckLookCtrl.neckLookScript; NeckTypeStateVer2 param = neckLookScript.neckTypeStates[neckLookCtrl.ptnNo]; angle = new Vector2(rot.x, rot.y); for (int i = neckLookScript.aBones.Length - 1; i > -1; i--) { NeckObjectVer2 bone = neckLookScript.aBones[i]; RotateToAngle(param, i, bone); } }
private void OnDrawGizmos() { if (Object.op_Implicit((Object)this.boneCalcAngle)) { Gizmos.set_color(new Color(1f, 1f, 1f, 0.3f)); if (this.neckTypeStates.Length > this.ptnDraw) { NeckTypeStateVer2 neckTypeState = this.neckTypeStates[this.ptnDraw]; Gizmos.set_color(new Color(0.0f, 1f, 1f, 0.3f)); Vector3 vector3_1 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, neckTypeState.hAngleLimit, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_1); Vector3 vector3_2 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, -neckTypeState.hAngleLimit, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_2); Vector3 vector3_3 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(neckTypeState.vAngleLimit, 0.0f, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_3); Vector3 vector3_4 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(-neckTypeState.vAngleLimit, 0.0f, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_4); Gizmos.DrawLine(vector3_1, vector3_4); Gizmos.DrawLine(vector3_4, vector3_2); Gizmos.DrawLine(vector3_2, vector3_3); Gizmos.DrawLine(vector3_3, vector3_1); if ((double)neckTypeState.limitBreakCorrectionValue != 0.0) { Gizmos.set_color(new Color(1f, 1f, 0.0f, 0.3f)); Vector3 vector3_5 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, neckTypeState.hAngleLimit + neckTypeState.limitBreakCorrectionValue, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_5); Vector3 vector3_6 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, -neckTypeState.hAngleLimit - neckTypeState.limitBreakCorrectionValue, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_6); Vector3 vector3_7 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(neckTypeState.vAngleLimit + neckTypeState.limitBreakCorrectionValue, 0.0f, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_7); Vector3 vector3_8 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(-neckTypeState.vAngleLimit - neckTypeState.limitBreakCorrectionValue, 0.0f, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_8); Gizmos.DrawLine(vector3_5, vector3_8); Gizmos.DrawLine(vector3_8, vector3_6); Gizmos.DrawLine(vector3_6, vector3_7); Gizmos.DrawLine(vector3_7, vector3_5); } Gizmos.set_color(new Color(1f, 0.0f, 1f, 0.8f)); float num1 = 0.0f; for (int index = 0; index < neckTypeState.aParam.Length; ++index) { num1 += neckTypeState.aParam[index].maxBendingAngle; } Vector3 vector3_9 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, num1, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_9); Vector3 vector3_10 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, num1 - neckTypeState.limitAway, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_10); Gizmos.DrawLine(vector3_9, vector3_10); float num2 = 0.0f; for (int index = 0; index < neckTypeState.aParam.Length; ++index) { num2 += neckTypeState.aParam[index].minBendingAngle; } Vector3 vector3_11 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, num2, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_11); Vector3 vector3_12 = Vector3.op_Addition(this.boneCalcAngle.TransformDirection(Vector3.op_Multiply(Quaternion.op_Multiply(Quaternion.Euler(0.0f, num2 + neckTypeState.limitAway, 0.0f), Vector3.get_forward()), this.drawLineLength)), this.boneCalcAngle.get_position()); Gizmos.DrawLine(this.boneCalcAngle.get_position(), vector3_12); Gizmos.DrawLine(vector3_11, vector3_12); } } Gizmos.set_color(Color.get_white()); }
public void NeckUpdateCalc(Vector3 target, int ptnNo, bool _isUseBackUpPos = false) { if (!this.initEnd) { return; } this.nowPtnNo = ptnNo; if (!this.isEnabled || !this.skipCalc && (double)Time.get_deltaTime() == 0.0) { return; } NeckTypeStateVer2 neckTypeState = this.neckTypeStates[this.nowPtnNo]; if (!_isUseBackUpPos) { this.backupPos = target; } if (neckTypeState.aParam.Length != this.aBones.Length) { Debug.LogWarning((object)"パラメーターの個数と骨の個数が合っていない"); } else { if (this.skipCalc) { this.changeTypeTimer = this.changeTypeLeapTime; } this.changeTypeTimer = Mathf.Clamp(this.changeTypeTimer + Time.get_deltaTime(), 0.0f, this.changeTypeLeapTime); float num1 = Mathf.InverseLerp(0.0f, this.changeTypeLeapTime, this.changeTypeTimer); if (this.changeTypeLerpCurve != null) { num1 = this.changeTypeLerpCurve.Evaluate(num1); } if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.ANIMATION) { for (int index = 0; index < this.aBones.Length; ++index) { this.aBones[index].fixAngle = this.aBones[index].neckBone.get_localRotation(); this.aBones[index].neckBone.set_localRotation(Quaternion.Slerp(this.aBones[index].fixAngleBackup, this.aBones[index].fixAngle, num1)); if (Object.op_Inequality((Object)this.aBones[index].controlBone, (Object)null)) { this.aBones[index].controlBone.set_localRotation(this.aBones[index].fixAngle); if (((Component)this.aBones[index].controlBone).get_gameObject().get_activeSelf()) { ((Component)this.aBones[index].controlBone).get_gameObject().SetActive(false); } } } } else { bool flag1 = false; if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.CONTROL) { for (int index = 0; index < this.aBones.Length; ++index) { if (!Object.op_Inequality((Object)this.aBones[index].controlBone, (Object)null)) { flag1 = true; break; } } } if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.CONTROL && !flag1) { for (int index = 0; index < this.aBones.Length; ++index) { if (index != 0) { ((Component)this.aBones[index].controlBone).get_gameObject().SetActive(!((Component)this.aBones[0].controlBone).get_gameObject().get_activeSelf()); } this.aBones[index].fixAngle = this.aBones[index].controlBone.get_localRotation(); float num2 = Mathf.InverseLerp(0.0f, this.changeTypeLeapTime, this.changeTypeTimer); this.aBones[index].neckBone.set_localRotation(Quaternion.Lerp(this.aBones[index].fixAngleBackup, this.aBones[index].fixAngle, num2)); } } else { for (int index = 0; index < this.aBones.Length; ++index) { if (!Object.op_Equality((Object)this.aBones[index].controlBone, (Object)null) && ((Component)this.aBones[index].controlBone).get_gameObject().get_activeSelf()) { ((Component)this.aBones[index].controlBone).get_gameObject().SetActive(false); } } if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.FORWARD || flag1) { for (int index = 0; index < this.aBones.Length; ++index) { this.aBones[index].fixAngle = Quaternion.get_identity(); Quaternion quaternion = Quaternion.Slerp(this.aBones[index].neckBone.get_localRotation(), this.aBones[index].fixAngle, this.calcLerp); this.aBones[index].neckBone.set_localRotation(Quaternion.Slerp(this.aBones[index].fixAngleBackup, quaternion, num1)); if (Object.op_Inequality((Object)this.aBones[index].controlBone, (Object)null)) { this.aBones[index].controlBone.set_localRotation(this.aBones[index].fixAngle); } } } else if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.FIX) { for (int index = 0; index < this.aBones.Length; ++index) { Quaternion quaternion = Quaternion.Slerp(this.aBones[index].neckBone.get_localRotation(), this.aBones[index].fixAngle, this.calcLerp); this.aBones[index].neckBone.set_localRotation(Quaternion.Slerp(this.aBones[index].fixAngleBackup, quaternion, num1)); if (Object.op_Inequality((Object)this.aBones[index].controlBone, (Object)null)) { this.aBones[index].controlBone.set_localRotation(this.aBones[index].fixAngle); } } } else { Vector3 dirB = Vector3.op_Subtraction(target, this.boneCalcAngle.get_position()); float num2 = this.AngleAroundAxis(this.boneCalcAngle.get_forward(), dirB, this.boneCalcAngle.get_up()); float num3 = this.AngleAroundAxis(this.boneCalcAngle.get_forward(), dirB, this.boneCalcAngle.get_right()); bool flag2 = false; float num4 = !neckTypeState.isLimitBreakBackup ? this.neckTypeStates[ptnNo].limitBreakCorrectionValue : 0.0f; if ((double)Mathf.Abs(num2) > (double)this.neckTypeStates[ptnNo].hAngleLimit + (double)num4 || (double)Mathf.Abs(num3) > (double)this.neckTypeStates[ptnNo].vAngleLimit + (double)num4) { flag2 = true; } neckTypeState.isLimitBreakBackup = flag2; if (flag2) { this.nowAngle = Vector2.get_zero(); } else { if (_isUseBackUpPos) { target = this.backupPos; } this.nowAngle = this.GetAngleToTarget(target, this.aBones[this.aBones.Length - 1], 1f); if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.TARGET) { Matrix4x4 matrix4x4 = Matrix4x4.TRS(this.transformAim.get_position(), this.boneCalcAngle.get_rotation(), this.transformAim.get_lossyScale()); Matrix4x4 inverse1 = ((Matrix4x4) ref matrix4x4).get_inverse(); Vector3 vector3_1 = ((Matrix4x4) ref inverse1).MultiplyPoint3x4(target); Matrix4x4 inverse2 = ((Matrix4x4) ref matrix4x4).get_inverse(); Vector3 vector3_2 = ((Matrix4x4) ref inverse2).MultiplyPoint3x4(this.boneCalcAngle.get_position()); if (vector3_1.z < 0.0 && vector3_1.y < 0.0) { if (vector3_2.x < 0.0) { if (vector3_2.x < vector3_1.x && vector3_1.x < 0.0) { target = this.transformAim.get_position(); } } else if (vector3_2.x > vector3_1.x && vector3_1.x > 0.0) { target = this.transformAim.get_position(); } } Vector3 vector3_3 = Vector3.op_Subtraction(this.transformAim.get_position(), target); if ((double)((Vector3) ref vector3_3).get_magnitude() == 0.0) { for (int index = 0; index < this.aBones.Length; ++index) { this.CalcNeckBone(this.aBones[index]); this.aBones[index].neckBone.set_localRotation(Quaternion.Slerp(this.aBones[index].fixAngleBackup, this.aBones[index].fixAngle, num1)); } return; } } else if (neckTypeState.lookType == NECK_LOOK_TYPE_VER2.AWAY) { float num5 = 0.0f; float num6 = 0.0f; for (int index = 0; index < this.aBones.Length; ++index) { num5 += this.aBones[index].angleH; } if (this.nowAngle.y <= (double)num5) { for (int index = 0; index < this.aBones.Length; ++index) { num6 += neckTypeState.aParam[index].maxBendingAngle; } if (this.nowAngle.y <= (double)num6 - (double)neckTypeState.limitAway || this.nowAngle.y < 0.0) { this.nowAngle.y = (__Null)(double)num6; } else { this.nowAngle.y = (__Null)0.0; for (int index = 0; index < this.aBones.Length; ++index) { ref Vector2 local = ref this.nowAngle; local.y = (__Null)(local.y + (double)neckTypeState.aParam[index].minBendingAngle); } } } else if (this.nowAngle.y > (double)num5) { for (int index = 0; index < this.aBones.Length; ++index) { num6 += neckTypeState.aParam[index].minBendingAngle; } if (this.nowAngle.y >= (double)num6 + (double)neckTypeState.limitAway || this.nowAngle.y > 0.0) { this.nowAngle.y = (__Null)(double)num6; } else { this.nowAngle.y = (__Null)0.0; for (int index = 0; index < this.aBones.Length; ++index) { ref Vector2 local = ref this.nowAngle; local.y = (__Null)(local.y + (double)neckTypeState.aParam[index].maxBendingAngle); } } } this.nowAngle.x = -this.nowAngle.x; } } Vector2 nowAngle = this.nowAngle; for (int _boneNum = this.aBones.Length - 1; _boneNum > -1; --_boneNum) { this.RotateToAngle(this.aBones[_boneNum], neckTypeState, _boneNum, ref nowAngle); } for (int index = 0; index < this.aBones.Length; ++index) { Quaternion quaternion = Quaternion.Slerp(this.aBones[index].backupLocalRotaionByTarget, this.aBones[index].fixAngle, this.calcLerp); this.aBones[index].neckBone.set_localRotation(Quaternion.Slerp(this.aBones[index].fixAngleBackup, quaternion, num1)); if (Object.op_Inequality((Object)this.aBones[index].controlBone, (Object)null)) { this.aBones[index].controlBone.set_localRotation(this.aBones[index].fixAngle); } } } } }