/// <summary> /// Returns true if player is facing away from the bed. /// </summary> /// <param name="player"></param> /// <returns></returns> public bool CheckPlayerFacing(Transform player) { float leftAngle = ArcFunctions.AngleHalf(Vector3.up, player.transform.forward, Vector3.forward); float forwardAngle = ArcFunctions.AngleHalf(Vector3.up, Camera.main.transform.forward, Vector3.left); if (leftAngle > facingTriggerDegree || forwardAngle < -facingTriggerDegree) { return(true); } else { return(false); } }
public static Vector3 BiarcPoint(Vector3 positionOne, Vector3 vectorOne, Vector3 positionTwo, Vector3 vectorTwo, float t) { float combinedAngle = 0; combinedAngle += (AngleHalf(Vector3.forward, vectorOne, Vector3.up) + -AngleHalf(Vector3.forward, vectorTwo, Vector3.up)) / 2; combinedAngle += AngleHalf(Vector3.forward, Vector3.Normalize(positionTwo - positionOne), Vector3.up); Vector3 combined = Vector3.Normalize(Quaternion.AngleAxis(combinedAngle, Vector3.up) * Vector3.forward); Vector3 arcMid = Vector3.zero; ArcData data; ArcData dataCircOne; ArcData dataCircTwo; arcMid = ArcFunctions.ArcNormalised(out data, positionOne, combined, positionTwo, t); float circ = 0; ArcFunctions.ArcNormalised(out dataCircOne, positionOne, vectorOne, arcMid, 0); ArcFunctions.ArcNormalised(out dataCircTwo, positionTwo, -vectorTwo, arcMid, 0); circ = (dataCircOne.angle * dataCircOne.circumference) + (dataCircTwo.angle * dataCircTwo.circumference); ArcData data2; ArcData dataCircOne1; ArcData dataCircTwo1; arcMid = ArcFunctions.ArcNormalised(out data2, positionOne, -combined, positionTwo, t); float circ2 = data2.angle; ArcFunctions.ArcNormalised(out dataCircOne1, positionOne, vectorOne, arcMid, 0); ArcFunctions.ArcNormalised(out dataCircTwo1, positionTwo, -vectorTwo, arcMid, 0); circ2 = (dataCircOne1.angle * dataCircOne1.circumference) + (dataCircTwo1.angle * dataCircTwo1.circumference); if (circ < circ2) { arcMid = ArcFunctions.ArcNormalised(out data, positionOne, combined, positionTwo, t); } else if (circ > circ2) { arcMid = ArcFunctions.ArcNormalised(out data, positionOne, -combined, positionTwo, t); } return(arcMid); }
public override void Update() { base.Update(); #region Camera Math Vector3 dir = ((fireLight.transform.position + transform.position) / 2) - player.transform.position; float angleY = ArcFunctions.AngleHalf(dir, player.transform.forward, Vector3.up); float abs_AngleY = Mathf.Abs(angleY); float map_AngleY = map(abs_AngleY, 0, slowViewTriggerAngle, 1, 0); float anglePlayerX = ArcFunctions.AngleHalf(dir, cam.transform.forward, player.transform.right); float abs_AnglePlayerX = Mathf.Abs(anglePlayerX); float map_AnglePlayerX = map(abs_AnglePlayerX, 0, slowViewTriggerAngle, 1, 0); map_AngleXY = map_AngleY * map_AnglePlayerX; abs_Sum = abs_AnglePlayerX + abs_AnglePlayerX + abs_AngleY; #endregion #region Annoying Camera //player if (r_sleepScript.sleepState == SleepState.standing && abs_AngleY < slowViewTriggerAngle) { float y_rotate_Amount = map_AngleXY * map_AngleY * rotateAmount * Time.deltaTime; if (angleY > 0) { r_mouseLook.TriggerFirePlayerRotate(y_rotate_Amount); } else { r_mouseLook.TriggerFirePlayerRotate(-y_rotate_Amount); } if (abs_AnglePlayerX < slowViewTriggerAngle) { float x_rotate_Amount = map_AngleXY * map_AnglePlayerX * rotateAmount * Time.deltaTime; if (anglePlayerX > 0) { r_mouseLook.TriggerFireCameraRotate(x_rotate_Amount); } else { r_mouseLook.TriggerFireCameraRotate(-x_rotate_Amount); } } } #endregion #region LookAtTrigger if (Interaction.reticule == LookingAt.Fire) { lookingAtFire = true; lookAtFireTimer += Time.deltaTime; } else { lookingAtFire = false; lookAtFireTimer -= Time.deltaTime / 2; if (lookAtFireTimer < 0) { lookAtFireTimer = 0; } } #endregion #region fireEffects float fireTimerPercentage = lookAtFireTimer / lookAtFireTimerMax; foreach (Rotate rot in flameArray) { rot.speed = flameRotateSpeedNormal + fireTimerPercentage * flameRotateSpeedModifier; } particles.SetEmissionRate(2 + fireTimerPercentage * 4); fireLight.intensity = lightIntensityNormal + fireTimerPercentage * lightIntensityModifier; float newScaleNumber = 0.5f + fireTimerPercentage; transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(1, newScaleNumber, 1), 0.2f); #endregion if (lookAtFireTimer > lookAtFireTimerMax) { DreamTriggerEffect(); } }
public static Vector3 ArcNormalised(out ArcData data, Vector3 startPosition, Vector3 startNormal, Vector3 endPosition, float t) { //Vector3 currentNormal; Vector3 toEndNormal; //Vector3 toStartNormal; Vector3 endNormal; Vector3 startInsideNormal; Vector3 endInsideNormal; //Vector3 startPoint; //Vector3 endPoint; //Vector3 anglePoint; Vector3 circleCentre = Vector3.zero; Vector3 intersect = Vector3.zero; float radius; float angle = 0; float properAngle = 0; float angleToStart; //float angleToEnd; float worldAngle; float worldAngleTwo; startPosition.y = 0; endPosition.y = 0; startNormal.y = 0; toEndNormal = Vector3.Normalize(endPosition - startPosition); properAngle = AngleHalf(startNormal, toEndNormal, Vector3.up); worldAngle = Vector3.Angle(Vector3.forward, startNormal); worldAngleTwo = AngleHalf(Vector3.forward, startNormal, Vector3.up); if (properAngle > 0) { //anglePoint = startNormal * (Vector3.Distance(startPosition, endPosition) * 0.5f); //toStartNormal = Vector3.Normalize(startPosition - endPosition); angle = Vector3.Angle(startNormal, toEndNormal); endNormal = Quaternion.Euler(new Vector3(0, angle, 0)) * -toEndNormal; endInsideNormal = Quaternion.Euler(new Vector3(0, -90, 0)) * endNormal; startInsideNormal = Quaternion.Euler(new Vector3(0, 90, 0)) * startNormal; angleToStart = AngleFull(startInsideNormal, endInsideNormal, Vector3.up); } else { //anglePoint = startNormal * (Vector3.Distance(startPosition, endPosition) * 0.5f); //toStartNormal = Vector3.Normalize(startPosition - endPosition); angle = Vector3.Angle(startNormal, toEndNormal); endNormal = Quaternion.Euler(new Vector3(0, -angle, 0)) * -toEndNormal; endInsideNormal = Quaternion.Euler(new Vector3(0, 90, 0)) * endNormal; startInsideNormal = Quaternion.Euler(new Vector3(0, -90, 0)) * startNormal; angleToStart = AngleFull(endInsideNormal, startInsideNormal, Vector3.up); } if (LineLineIntersection(out intersect, startPosition, startInsideNormal * 100000, endPosition, endInsideNormal * 100000)) { circleCentre = intersect; } else { } radius = Vector3.Distance(circleCentre, startPosition); Vector3 newPos = Vector3.zero; if (angleToStart < 1) { } else { } Vector3 tNormal; if (LineLineIntersection(out intersect, startPosition, startInsideNormal * 100000, endPosition, endInsideNormal * 100000)) { if (properAngle > 0) { if (worldAngleTwo >= 0) { newPos = Orbit(circleCentre, radius, -90 + t * (angleToStart) + worldAngle); } else { newPos = Orbit(circleCentre, radius, -90 + t * (angleToStart) - worldAngle); } } else { if (worldAngleTwo >= 0) { newPos = Orbit2(circleCentre, radius, -90 + t * (angleToStart) - worldAngle); } else { newPos = Orbit2(circleCentre, radius, -90 + t * (angleToStart) + worldAngle); } } tNormal = Vector3.Normalize(circleCentre - newPos); } else { newPos = Vector3.Lerp(startPosition, endPosition, t); tNormal = Quaternion.Euler(0, 90, 0) * Vector3.Normalize(endPosition - startPosition); endNormal = Vector3.Normalize(startPosition - endPosition); } //float newAngle =AngleFull(startNormal, endNormal, Vector3.up); data = new ArcData(startPosition, startNormal, endPosition, -endNormal, radius, 2 * radius * Mathf.PI, angleToStart, circleCentre, ArcFunctions.ArcLength(startPosition, startNormal, endPosition), tNormal); return(newPos); }