diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs new file mode 100644 index 0000000..00ff8bb --- /dev/null +++ b/Assets/MainBehaviour.cs @@ -0,0 +1,179 @@ +using System.Collections.Generic; +using Models; +using UnityEngine; + +public class MainBehaviour : MonoBehaviour +{ + private readonly GameObject[] _nodes = new GameObject[(int)PoseLandmarkType.MaxValue]; + private readonly List _bonds = new List(); + private readonly PoseTransform[] _poseTransforms = new PoseTransform[(int)PoseLandmarkType.MaxValue]; + private readonly UdpListener _listener = new UdpListener(); + private const float Scale = 0.2f; + + // Start is called before the first frame update + private void Start() + { + PoseTransform.AverageLength = 3; + + CreateNodes(); + CreateBonds(); + + _listener.AddHandler(OnReceive); + _listener.Connect(5000); + } + + // Update is called once per frame + private void Update() + { + for (var i = 0; i < (int)PoseLandmarkType.MaxValue; i++) + { + _nodes[i].transform.position = _poseTransforms[i].AveragePos * -5; + } + + foreach (var bond in _bonds) + { + bond.UpdateBond(); + } + } + + private void OnDisable() + { + _listener.DisConnect(); + } + + private void OnReceive(List landmarks) + { + foreach (var landmark in landmarks) + { + PoseTransform.UpdatePosition(ref _poseTransforms[(int)landmark.Type], landmark); + } + } + + private void CreateNodes() + { + for (var i = 0; i < (int)PoseLandmarkType.MaxValue; i++) + { + var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); + + ball.transform.localScale = new Vector3(Scale, Scale, Scale); + + if (i <= 10) + { + ball.GetComponent().material.color = Color.red;//给头部添加颜色 + } + else if (i <= 22) + { + ball.GetComponent().material.color = Color.blue;//给手部添加颜色 + } + else if (i <= 32) + { + ball.GetComponent().material.color = Color.green;//给脚部添加颜色 + } + + _nodes[i] = ball; + _poseTransforms[i] = new PoseTransform((PoseLandmarkType)i); + } + } + + private void CreateBonds() + { + var headBonds = new[] + { + PoseLandmarkType.RightEar, + PoseLandmarkType.RightEyeOuter, + PoseLandmarkType.RightEye, + PoseLandmarkType.RightEyeInner, + PoseLandmarkType.Nose, + PoseLandmarkType.LeftEyeInner, + PoseLandmarkType.LeftEye, + PoseLandmarkType.LeftEyeOuter, + PoseLandmarkType.LeftEar + }; + _bonds.AddRange(GenerateBondsList(headBonds)); + + var monthBonds = new[] + { + PoseLandmarkType.MouthLeft, + PoseLandmarkType.MouthRight, + }; + _bonds.AddRange(GenerateBondsList(monthBonds)); + + var leftArmBonds = new[] + { + PoseLandmarkType.LeftShoulder, + PoseLandmarkType.LeftElbow, + PoseLandmarkType.LeftWrist, + PoseLandmarkType.LeftPinky, + PoseLandmarkType.LeftIndex, + PoseLandmarkType.LeftWrist, + PoseLandmarkType.LeftThumb + }; + _bonds.AddRange(GenerateBondsList(leftArmBonds)); + + var rightArmBonds = new[] + { + PoseLandmarkType.RightShoulder, + PoseLandmarkType.RightElbow, + PoseLandmarkType.RightWrist, + PoseLandmarkType.RightPinky, + PoseLandmarkType.RightIndex, + PoseLandmarkType.RightWrist, + PoseLandmarkType.RightThumb + }; + _bonds.AddRange(GenerateBondsList(rightArmBonds)); + + var leftLegBonds = new[] + { + PoseLandmarkType.LeftShoulder, + PoseLandmarkType.LeftHip, + PoseLandmarkType.LeftKnee, + PoseLandmarkType.LeftAnkle, + PoseLandmarkType.LeftHeel, + PoseLandmarkType.LeftFootIndex, + PoseLandmarkType.LeftAnkle + }; + _bonds.AddRange(GenerateBondsList(leftLegBonds)); + + var rightLegBonds = new[] + { + PoseLandmarkType.RightShoulder, + PoseLandmarkType.RightHip, + PoseLandmarkType.RightKnee, + PoseLandmarkType.RightAnkle, + PoseLandmarkType.RightHeel, + PoseLandmarkType.RightFootIndex, + PoseLandmarkType.RightAnkle + }; + _bonds.AddRange(GenerateBondsList(rightLegBonds)); + + // 最后手动添加身体上的两条横线 + _bonds.Add(new Bond( + _nodes[(int)PoseLandmarkType.LeftShoulder], + _nodes[(int)PoseLandmarkType.RightShoulder], + Scale)); + _bonds.Add(new Bond( + _nodes[(int)PoseLandmarkType.LeftHip], + _nodes[(int)PoseLandmarkType.RightHip], + Scale)); + } + + /// + /// 创建棍子列表 + /// + /// 需要连接起来的关键点 需要按顺序设置 + /// + private List GenerateBondsList(PoseLandmarkType[] nodes) + { + var bonds = new List(); + + for (var i = 0; i < nodes.Length - 1; i++) + { + bonds.Add(new Bond( + _nodes[(int)nodes[i]], + _nodes[(int)nodes[i + 1]], + Scale)); + } + + return bonds; + } +} diff --git a/Assets/MainBehaviour.cs.meta b/Assets/MainBehaviour.cs.meta new file mode 100644 index 0000000..e8b942d --- /dev/null +++ b/Assets/MainBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574a3724e040787f7afd9341fba89cf2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials.meta b/Assets/Materials.meta new file mode 100644 index 0000000..c309ed8 --- /dev/null +++ b/Assets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2963c03969c7f6d480483b45e36590b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PlaneMaterial.mat b/Assets/Materials/PlaneMaterial.mat new file mode 100644 index 0000000..28c017d --- /dev/null +++ b/Assets/Materials/PlaneMaterial.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PlaneMaterial + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.29922488, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PlaneMaterial.mat.meta b/Assets/Materials/PlaneMaterial.mat.meta new file mode 100644 index 0000000..9f5d305 --- /dev/null +++ b/Assets/Materials/PlaneMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6083fe04391087ca294999838984a59c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModelBehaviour.cs b/Assets/ModelBehaviour.cs index 5353c58..619a088 100644 --- a/Assets/ModelBehaviour.cs +++ b/Assets/ModelBehaviour.cs @@ -8,7 +8,7 @@ public class ModelBehaviour : MonoBehaviour private readonly UdpListener _listener = new UdpListener(); - //private static readonly List _posLandmarks = new List(); + private static readonly List _posLandmarks = new List(); private static readonly List PoseTransforms = new List(); @@ -16,10 +16,10 @@ private void Start() { _animator = GetComponent(); // 获取动画控件 - + TransformatorInit(); //匹配初始化 InitPoseTransformList(); - //_listener.AddHandler(LogLandmarks); + _listener.AddHandler(LogLandmarks); _listener.AddHandler(RigPoint); _listener.Connect(5000); } @@ -61,7 +61,7 @@ private static void LogLandmarks(List landmarks) //获取传上来的数据点坐标转换成四元数的回调函数 private static void RigPoint(List landmarks) { - + foreach (var landmark in landmarks) { var temp = PoseTransforms[(int)landmark.Type]; @@ -110,32 +110,32 @@ private void InitPoseTransformList() item.PreviousQuaternion = _animator.GetBoneTransform(item.UnityName).rotation; item.CurrentQuaternion = item.PreviousQuaternion; } - + PoseTransforms.Add(item); } - + // 在这里添加父节点 AddParentTransform(PoseLandmarkType.LeftShoulder, PoseLandmarkType.LeftHip); AddParentTransform(PoseLandmarkType.LeftShoulder, PoseLandmarkType.RightHip); AddParentTransform(PoseLandmarkType.RightShoulder, PoseLandmarkType.LeftHip); AddParentTransform(PoseLandmarkType.RightShoulder, PoseLandmarkType.RightHip); - + AddParentTransform(PoseLandmarkType.Nose, PoseLandmarkType.LeftShoulder); AddParentTransform(PoseLandmarkType.Nose, PoseLandmarkType.RightShoulder); - + AddParentTransform(PoseLandmarkType.LeftElbow, PoseLandmarkType.LeftShoulder); AddParentTransform(PoseLandmarkType.RightElbow, PoseLandmarkType.RightShoulder); - + AddParentTransform(PoseLandmarkType.LeftWrist, PoseLandmarkType.LeftElbow); AddParentTransform(PoseLandmarkType.RightWrist, PoseLandmarkType.RightElbow); - + AddParentTransform(PoseLandmarkType.LeftKnee, PoseLandmarkType.LeftHip); AddParentTransform(PoseLandmarkType.RightKnee, PoseLandmarkType.RightHip); - + AddParentTransform(PoseLandmarkType.LeftAnkle, PoseLandmarkType.LeftKnee); AddParentTransform(PoseLandmarkType.RightAnkle, PoseLandmarkType.RightKnee); - + AddParentTransform(PoseLandmarkType.LeftFootIndex, PoseLandmarkType.LeftAnkle); AddParentTransform(PoseLandmarkType.RightFootIndex, PoseLandmarkType.RightAnkle); } diff --git a/Assets/Models/Bond.cs b/Assets/Models/Bond.cs new file mode 100644 index 0000000..a6868d1 --- /dev/null +++ b/Assets/Models/Bond.cs @@ -0,0 +1,44 @@ +using UnityEngine; + +namespace Models +{ + /// + /// 捕捉点之间的连接线 + /// + public class Bond + { + protected readonly GameObject Start; + protected readonly GameObject End; + private readonly GameObject _bond; + + public Bond(GameObject start,GameObject end,float scale) + { + Start = start; + End = end; + + _bond = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + _bond.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + //这里可以设置材质,具体自己设置 + _bond.GetComponent().material.color = Color.cyan; + } + + + public void UpdateBond() + { + var startPos = Start.transform.position; + var endPos = End.transform.position; + var rightPosition = (startPos + endPos) / 2; + var rightRotation = endPos - startPos; + var halfLength = Vector3.Distance(startPos, endPos) / 2; + var thickness = 0.1f;//线的粗细 + + //创建圆柱体 + //bond.gameObject.transform.parent = transform; + _bond.transform.position = rightPosition; + _bond.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + _bond.transform.localScale = new Vector3(thickness, halfLength, thickness); + } + } +} \ No newline at end of file diff --git a/Assets/Models/Bond.cs.meta b/Assets/Models/Bond.cs.meta new file mode 100644 index 0000000..5dc5c31 --- /dev/null +++ b/Assets/Models/Bond.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 94a8f8c83e58421d9447173d38482d74 +timeCreated: 1677230676 \ No newline at end of file diff --git a/Assets/Models/PoseLandmarkType.cs b/Assets/Models/PoseLandmarkType.cs index c32eda7..7b86f39 100644 --- a/Assets/Models/PoseLandmarkType.cs +++ b/Assets/Models/PoseLandmarkType.cs @@ -35,6 +35,7 @@ public enum PoseLandmarkType LeftHeel, RightHeel, LeftFootIndex, - RightFootIndex + RightFootIndex, + MaxValue } } \ No newline at end of file diff --git a/Assets/Models/PoseTransform.cs b/Assets/Models/PoseTransform.cs index 1fb2f9a..8d4570d 100644 --- a/Assets/Models/PoseTransform.cs +++ b/Assets/Models/PoseTransform.cs @@ -20,9 +20,14 @@ public struct PoseTransform public readonly HumanBodyBones UnityName; /// - /// MediaPipe捕捉空间坐标 + /// 取平均的长度 /// - public Vector3 MediaPipePos; + public static int AverageLength; + + /// + /// 取平均之后的结果 + /// + public Vector3 AveragePos; /// /// 节点的父节点列表 @@ -39,23 +44,50 @@ public struct PoseTransform /// public Quaternion CurrentQuaternion; + private int _count; + private readonly Queue _landmarkQueue; + public PoseTransform( - PoseLandmarkType type + PoseLandmarkType type, + int averageLength = 5 ) { MediaPipeName = type; UnityName = GetRelatedBone(type); - MediaPipePos = new Vector3(); + AveragePos = new Vector3(); Parent = new List(); PreviousQuaternion = new Quaternion(); CurrentQuaternion = new Quaternion(); + AverageLength = averageLength; + + _count = 0; + _landmarkQueue = new Queue(); } - /// - /// 计算当前的旋转四元数 - /// - /// - public void CalculateCurrentQuaternion(PoseLandmark landmark) + public static void UpdatePosition(ref PoseTransform pose, PoseLandmark landmark) + { + if (pose._count < AverageLength) + { + pose._landmarkQueue.Enqueue(landmark); + pose._count++; + } + else + { + pose._landmarkQueue.Dequeue(); + pose._landmarkQueue.Enqueue(landmark); + + var sum = new Vector3(); + + foreach (var poseLandmark in pose._landmarkQueue) + { + sum += new Vector3(poseLandmark.X, poseLandmark.Y, poseLandmark.Z); + } + + pose.AveragePos = sum / AverageLength; + } + } + + public static void CalculateRotation(PoseTransform poseTransform) { //var temp = _posLandmarks.Find(t=>t.mediaPipeName == landmark.Type.ToString()); @@ -134,51 +166,5 @@ private static HumanBodyBones GetRelatedBone(PoseLandmarkType type) } - //绕X轴旋转 - private Matrix4x4 RotateAxisX(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(1,0,0,0)); - matrix.SetRow(1, new Vector4(0,cosrot,-sinrot,0)); - matrix.SetRow(2, new Vector4(0,sinrot,cosrot,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } - - //绕Y轴旋转 - private Matrix4x4 RotateAxisY(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(cosrot,0,sinrot,0)); - matrix.SetRow(1, new Vector4(0,1,0,0)); - matrix.SetRow(2, new Vector4(-sinrot,0,cosrot,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } - - //绕Z轴旋转 - private Matrix4x4 RotateAxisZ(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(cosrot,-sinrot,0,0)); - matrix.SetRow(1, new Vector4(sinrot,cosrot,0,0)); - matrix.SetRow(2, new Vector4(0,0,1,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } - - } } \ No newline at end of file diff --git a/Assets/Models/VirtualSkeleton.cs b/Assets/Models/VirtualSkeleton.cs new file mode 100644 index 0000000..d325d3f --- /dev/null +++ b/Assets/Models/VirtualSkeleton.cs @@ -0,0 +1,35 @@ +using UnityEngine; + +namespace Models +{ + public class VirtualSkeleton : Bond + { + private readonly GameObject _virtualSkeleton; + + public VirtualSkeleton(GameObject start,GameObject end,float scale) : base(start,end,scale) + { + _virtualSkeleton = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + _virtualSkeleton.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + _virtualSkeleton.GetComponent().material.color = Color.white; + } + + /// + /// 覆盖基类的更新方法 + /// + public new void UpdateBond() + { + var startPos = Start.transform.position; + var endPos = End.transform.position; + + var rightPosition = (startPos + endPos) / 2; + var rightRotation = endPos - startPos; + var lThickness = 0.2f; + + _virtualSkeleton.transform.position = rightPosition; + _virtualSkeleton.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + _virtualSkeleton.transform.localScale = new Vector3(lThickness, lThickness, lThickness); + } + } +} \ No newline at end of file diff --git a/Assets/Models/VirtualSkeleton.cs.meta b/Assets/Models/VirtualSkeleton.cs.meta new file mode 100644 index 0000000..067f9c7 --- /dev/null +++ b/Assets/Models/VirtualSkeleton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5f725336fc6a4481a4c7d74ec0e3b17b +timeCreated: 1677413910 \ No newline at end of file diff --git a/Assets/Scenes/BallScene.unity b/Assets/Scenes/BallScene.unity new file mode 100644 index 0000000..b8324e2 --- /dev/null +++ b/Assets/Scenes/BallScene.unity @@ -0,0 +1,459 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &99618223 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 99618227} + - component: {fileID: 99618226} + - component: {fileID: 99618225} + - component: {fileID: 99618224} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &99618224 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &99618225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 6083fe04391087ca294999838984a59c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &99618226 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &99618227 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &182244630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 182244631} + - component: {fileID: 182244632} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &182244631 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182244630} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &182244632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182244630} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 574a3724e040787f7afd9341fba89cf2, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &443683957 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 443683959} + - component: {fileID: 443683958} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &443683958 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443683957} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &443683959 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443683957} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &2045151417 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2045151420} + - component: {fileID: 2045151419} + - component: {fileID: 2045151418} + - component: {fileID: 2045151421} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2045151418 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 +--- !u!20 &2045151419 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2045151420 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 7} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!114 &2045151421 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9189b565e8ba9bfc3bdaa38149e3e13f, type: 3} + m_Name: + m_EditorClassIdentifier: + target: {fileID: 182244631} diff --git a/Assets/Scenes/BallScene.unity.meta b/Assets/Scenes/BallScene.unity.meta new file mode 100644 index 0000000..867553f --- /dev/null +++ b/Assets/Scenes/BallScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 53edd235eaf7da249a8204f606eb1489 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Utils/RotateUtils.cs b/Assets/Utils/RotateUtils.cs new file mode 100644 index 0000000..5a8e52f --- /dev/null +++ b/Assets/Utils/RotateUtils.cs @@ -0,0 +1,67 @@ +using System; +using UnityEngine; + +namespace Utils +{ + /// + /// 旋转工具类 + /// + public static class RotateUtils + { + private static Matrix4x4 _matrix; + + /// + /// 获得绕X轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisX(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0 ,new Vector4(1,0,0,0)); + _matrix.SetRow(1, new Vector4(0, cos, -sin, 0)); + _matrix.SetRow(2, new Vector4(0, sin, cos, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + + /// + /// 获得绕Y轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisY(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0, new Vector4(cos, 0, sin, 0)); + _matrix.SetRow(1, new Vector4(0, 1, 0, 1)); + _matrix.SetRow(2, new Vector4(-sin, 0, cos, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + + /// + /// 获得绕Z轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisZ(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0, new Vector4(cos, -sin, 0, 0)); + _matrix.SetRow(1, new Vector4(sin, cos, 0, 0)); + _matrix.SetRow(2, new Vector4(0, 0, 1, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + } +} \ No newline at end of file diff --git a/Assets/Utils/RotateUtils.cs.meta b/Assets/Utils/RotateUtils.cs.meta new file mode 100644 index 0000000..3f6599f --- /dev/null +++ b/Assets/Utils/RotateUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d748c6669d714e65a5ca9164c5798583 +timeCreated: 1677319275 \ No newline at end of file diff --git a/Assets/UdpListener.cs b/Assets/Utils/UdpListener.cs similarity index 100% rename from Assets/UdpListener.cs rename to Assets/Utils/UdpListener.cs diff --git a/Assets/UdpListener.cs.meta b/Assets/Utils/UdpListener.cs.meta similarity index 100% rename from Assets/UdpListener.cs.meta rename to Assets/Utils/UdpListener.cs.meta