From 969c8e3bd09c7e8938783a8ad614e7b71f80a500 Mon Sep 17 00:00:00 2001 From: Valera <108022376+kekobka@users.noreply.github.com> Date: Sat, 14 Jun 2025 18:21:37 +0700 Subject: [PATCH] new car camera --- Assets/prefabs/cars/debug_car.prefab | 35 ++-- Assets/scenes/minimal.scene | 256 +++++++++++++++++++++++++++ Libraries/meteorlab.velox | 2 +- code/LocalCar.cs | 21 ++- 4 files changed, 290 insertions(+), 24 deletions(-) diff --git a/Assets/prefabs/cars/debug_car.prefab b/Assets/prefabs/cars/debug_car.prefab index efa4dbd..a45d2ef 100644 --- a/Assets/prefabs/cars/debug_car.prefab +++ b/Assets/prefabs/cars/debug_car.prefab @@ -4978,9 +4978,10 @@ "__type": "VeloX.VeloXWheel", "__guid": "64e23ffa-c2d8-4d1b-97e2-2e6ec074e350", "__enabled": true, + "Ackermann": 0, "AutoPhysics": true, "BrakePowerMax": 3000, - "CamberAngle": -5, + "CamberAngle": 0, "CasterAngle": 0, "IsFront": true, "Mass": 30, @@ -4997,8 +4998,8 @@ "SpringStrength": 2800, "SteerMultiplier": 1, "SuspensionLength": 5, - "ToeAngle": -0.5, - "WheelFriction": "frictions/high-performance road tire.whfric", + "TirePreset": "frictions/default.tire", + "ToeAngle": 0, "Width": 9 } ], @@ -5084,9 +5085,10 @@ "__type": "VeloX.VeloXWheel", "__guid": "1863c712-5c7c-427b-b734-87b732d65502", "__enabled": true, + "Ackermann": 0, "AutoPhysics": true, "BrakePowerMax": 3000, - "CamberAngle": 5, + "CamberAngle": 0, "CasterAngle": 0, "IsFront": true, "Mass": 30, @@ -5103,8 +5105,8 @@ "SpringStrength": 2800, "SteerMultiplier": 1, "SuspensionLength": 5, - "ToeAngle": 0.5, - "WheelFriction": "frictions/high-performance road tire.whfric", + "TirePreset": "frictions/default.tire", + "ToeAngle": 0, "Width": 9 } ], @@ -5190,9 +5192,10 @@ "__type": "VeloX.VeloXWheel", "__guid": "32fbede7-4c34-4f7d-8ec3-594774e693dc", "__enabled": true, + "Ackermann": 0, "AutoPhysics": true, "BrakePowerMax": 3000, - "CamberAngle": -3, + "CamberAngle": 0, "CasterAngle": 0, "IsFront": false, "Mass": 30, @@ -5209,8 +5212,8 @@ "SpringStrength": 2800, "SteerMultiplier": 0, "SuspensionLength": 5, - "ToeAngle": -0.5, - "WheelFriction": "frictions/high-performance road tire.whfric", + "TirePreset": "frictions/default.tire", + "ToeAngle": 0, "Width": 9 } ], @@ -5296,9 +5299,10 @@ "__type": "VeloX.VeloXWheel", "__guid": "52e26121-2451-4373-b101-a2d7a4e51a09", "__enabled": true, + "Ackermann": 0, "AutoPhysics": true, "BrakePowerMax": 3000, - "CamberAngle": 3, + "CamberAngle": 0, "CasterAngle": 0, "IsFront": false, "Mass": 30, @@ -5315,8 +5319,8 @@ "SpringStrength": 2800, "SteerMultiplier": 0, "SuspensionLength": 5, - "ToeAngle": 0.5, - "WheelFriction": "frictions/high-performance road tire.whfric", + "TirePreset": "frictions/default.tire", + "ToeAngle": 0, "Width": 9 } ], @@ -5418,7 +5422,6 @@ "__type": "VeloX.Powertrain.Engine", "__guid": "0bc0d7ab-0688-4447-bb86-271c960a4cd8", "__enabled": true, - "FrictionCoeff": 0.01, "IdleRPM": 900, "Inertia": 0.151, "Input": null, @@ -5438,7 +5441,6 @@ "component_type": "Clutch" }, "RPMPercent": 0, - "StartFriction": -10, "Stream": "sounds/streams/v8_c63/v8_c63.engstr", "TorqueMap": { "rangey": "0,200", @@ -5608,7 +5610,6 @@ "__guid": "57ceb391-79ea-4d2d-a27f-cdd3c18e5789", "__enabled": true, "BiasAB": 0.5, - "CoastRamp": 1, "FinalDrive": 3.392, "Inertia": 0.01, "Input": { @@ -5635,10 +5636,6 @@ "go": "df6aec6f-b56f-4696-bd56-ffc02fc99bd3", "component_type": "PowerWheel" }, - "PowerRamp": 1, - "SlipTorque": 0, - "SteerLock": 45, - "Stiffness": 0.1, "Vehicle": { "_type": "component", "component_id": "03e04bce-db7b-4547-9cfd-0364849bdb33", diff --git a/Assets/scenes/minimal.scene b/Assets/scenes/minimal.scene index 9fca70d..92cca4e 100644 --- a/Assets/scenes/minimal.scene +++ b/Assets/scenes/minimal.scene @@ -626,6 +626,262 @@ } ], "Children": [] + }, + { + "__guid": "645d1465-69e8-4e2e-a3af-3f68da8164d1", + "__version": 1, + "Flags": 0, + "Name": "Cube", + "Position": "500,0,0", + "Rotation": "0.04361939,0,0,0.9990482", + "Scale": "10,50,1", + "Tags": "", + "Enabled": true, + "NetworkMode": 2, + "NetworkInterpolation": true, + "NetworkOrphaned": 0, + "OwnerTransfer": 1, + "Components": [ + { + "__type": "Sandbox.ModelRenderer", + "__guid": "7db79076-4eec-4f27-8842-bc65c970d957", + "__enabled": true, + "BodyGroups": 18446744073709551615, + "CreateAttachments": false, + "MaterialGroup": null, + "MaterialOverride": "materials/emo.vmat", + "Model": "models/dev/box.vmdl", + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "RenderOptions": { + "GameLayer": true, + "OverlayLayer": false, + "BloomLayer": false, + "AfterUILayer": false + }, + "RenderType": "On", + "Tint": "1,1,1,1" + }, + { + "__type": "Sandbox.BoxCollider", + "__guid": "3910b51a-8e0e-488c-963e-01f79ebbba32", + "__enabled": true, + "Center": "0,0,0", + "Friction": null, + "IsTrigger": false, + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "OnObjectTriggerEnter": null, + "OnObjectTriggerExit": null, + "OnTriggerEnter": null, + "OnTriggerExit": null, + "Scale": "50,50,50", + "Static": false, + "Surface": null, + "SurfaceVelocity": "0,0,0" + } + ], + "Children": [] + }, + { + "__guid": "40386ba9-c7fb-41ef-a1f3-f5f0066ee482", + "__version": 1, + "Flags": 0, + "Name": "Cube (3)", + "Position": "1000,0,0", + "Rotation": "0.08715574,0,0,0.9961947", + "Scale": "10,50,1", + "Tags": "", + "Enabled": true, + "NetworkMode": 2, + "NetworkInterpolation": true, + "NetworkOrphaned": 0, + "OwnerTransfer": 1, + "Components": [ + { + "__type": "Sandbox.ModelRenderer", + "__guid": "af2039a1-88e5-4961-9f27-45cc2d0e9906", + "__enabled": true, + "BodyGroups": 18446744073709551615, + "CreateAttachments": false, + "MaterialGroup": null, + "MaterialOverride": "materials/emo.vmat", + "Model": "models/dev/box.vmdl", + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "RenderOptions": { + "GameLayer": true, + "OverlayLayer": false, + "BloomLayer": false, + "AfterUILayer": false + }, + "RenderType": "On", + "Tint": "1,1,1,1" + }, + { + "__type": "Sandbox.BoxCollider", + "__guid": "62f5ff5f-e013-476c-9b3c-d9be6dc03005", + "__enabled": true, + "Center": "0,0,0", + "Friction": null, + "IsTrigger": false, + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "OnObjectTriggerEnter": null, + "OnObjectTriggerExit": null, + "OnTriggerEnter": null, + "OnTriggerExit": null, + "Scale": "50,50,50", + "Static": false, + "Surface": null, + "SurfaceVelocity": "0,0,0" + } + ], + "Children": [] + }, + { + "__guid": "e907e11d-cc14-475d-8b84-07553517150f", + "__version": 1, + "Flags": 0, + "Name": "Cube (4)", + "Position": "1500,0,0", + "Rotation": "0.1305262,0,0,0.9914449", + "Scale": "10,50,1", + "Tags": "", + "Enabled": true, + "NetworkMode": 2, + "NetworkInterpolation": true, + "NetworkOrphaned": 0, + "OwnerTransfer": 1, + "Components": [ + { + "__type": "Sandbox.ModelRenderer", + "__guid": "6c2d01d0-7492-4d4c-9021-0570aea9fcf1", + "__enabled": true, + "BodyGroups": 18446744073709551615, + "CreateAttachments": false, + "MaterialGroup": null, + "MaterialOverride": "materials/emo.vmat", + "Model": "models/dev/box.vmdl", + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "RenderOptions": { + "GameLayer": true, + "OverlayLayer": false, + "BloomLayer": false, + "AfterUILayer": false + }, + "RenderType": "On", + "Tint": "1,1,1,1" + }, + { + "__type": "Sandbox.BoxCollider", + "__guid": "84748465-2e79-4528-b3a0-418f677e36df", + "__enabled": true, + "Center": "0,0,0", + "Friction": null, + "IsTrigger": false, + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "OnObjectTriggerEnter": null, + "OnObjectTriggerExit": null, + "OnTriggerEnter": null, + "OnTriggerExit": null, + "Scale": "50,50,50", + "Static": false, + "Surface": null, + "SurfaceVelocity": "0,0,0" + } + ], + "Children": [] + }, + { + "__guid": "c106b32c-a0e3-4117-b7f9-638c18a96533", + "__version": 1, + "Flags": 0, + "Name": "Cube (5)", + "Position": "2000,0,0", + "Rotation": "0.1736482,0,0,0.9848077", + "Scale": "10,50,1", + "Tags": "", + "Enabled": true, + "NetworkMode": 2, + "NetworkInterpolation": true, + "NetworkOrphaned": 0, + "OwnerTransfer": 1, + "Components": [ + { + "__type": "Sandbox.ModelRenderer", + "__guid": "af00dbab-e2fa-4442-aeb0-65c534a87bec", + "__enabled": true, + "BodyGroups": 18446744073709551615, + "CreateAttachments": false, + "MaterialGroup": null, + "MaterialOverride": "materials/emo.vmat", + "Model": "models/dev/box.vmdl", + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "RenderOptions": { + "GameLayer": true, + "OverlayLayer": false, + "BloomLayer": false, + "AfterUILayer": false + }, + "RenderType": "On", + "Tint": "1,1,1,1" + }, + { + "__type": "Sandbox.BoxCollider", + "__guid": "4f50f469-5bdb-490a-a2fd-e5953788f87d", + "__enabled": true, + "Center": "0,0,0", + "Friction": null, + "IsTrigger": false, + "OnComponentDestroy": null, + "OnComponentDisabled": null, + "OnComponentEnabled": null, + "OnComponentFixedUpdate": null, + "OnComponentStart": null, + "OnComponentUpdate": null, + "OnObjectTriggerEnter": null, + "OnObjectTriggerExit": null, + "OnTriggerEnter": null, + "OnTriggerExit": null, + "Scale": "50,50,50", + "Static": false, + "Surface": null, + "SurfaceVelocity": "0,0,0" + } + ], + "Children": [] } ], "SceneProperties": { diff --git a/Libraries/meteorlab.velox b/Libraries/meteorlab.velox index 964b46e..629ae67 160000 --- a/Libraries/meteorlab.velox +++ b/Libraries/meteorlab.velox @@ -1 +1 @@ -Subproject commit 964b46e1c5397a574371edeb06b45b7067b72efa +Subproject commit 629ae6715c9fbddf6fddb5c28c578b1ccdfe36ef diff --git a/code/LocalCar.cs b/code/LocalCar.cs index 9ca82b2..440903b 100644 --- a/code/LocalCar.cs +++ b/code/LocalCar.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Text; using System.Threading.Channels; using System.Threading.Tasks; @@ -19,7 +20,9 @@ namespace Sandbox [Property] VeloXCar Car { get; set; } [Property] public Vector3 CameraOffset { get; set; } - private Angles EyeAngles { get; set; } + public float blendSpeed = 10f; + private Angles EyeAngles = new( 0, 180, 0 ); + private Rotation targetRotation; protected override void OnUpdate() { @@ -34,7 +37,7 @@ namespace Sandbox Angles input = Input.AnalogLook; Angles eyeAngles = EyeAngles; - eyeAngles += input; + eyeAngles += input.WithPitch( -input.pitch ); eyeAngles.roll = 0f; eyeAngles.pitch = eyeAngles.pitch.Clamp( 0f - 89, 89 ); @@ -46,8 +49,18 @@ namespace Sandbox { var cam = Scene.Camera; - cam.WorldRotation = EyeAngles; - cam.WorldPosition = WorldPosition + Vector3.Up * CameraOffset.z + cam.WorldRotation.Backward * CameraOffset.x; + + var zoffset = Vector3.Up * CameraOffset.z; + Vector3 targetPos = WorldPosition + zoffset + WorldRotation * EyeAngles * CameraOffset; + float blendFactor = blendSpeed * Time.Delta; + blendFactor = MathF.Min( blendFactor, 1f ); + cam.WorldPosition = Vector3.Lerp( cam.WorldPosition, targetPos, blendFactor ); + + Vector3 lookDirection = WorldPosition + zoffset - cam.WorldPosition; + if ( lookDirection != Vector3.Zero ) + targetRotation = Rotation.LookAt( lookDirection, Vector3.Up ); + + cam.WorldRotation = targetRotation; } } }