From 41013d6581e49b694f78b24ccc9b118a4b7894f5 Mon Sep 17 00:00:00 2001
From: BlackAngle233 <45509412+BlackAngle233@users.noreply.github.com>
Date: Tue, 10 Nov 2020 14:31:56 +0800
Subject: [PATCH] 11.10 update

---
 MRTK test/Assets/Prefabs/Ellipse.prefab       | 333 -----------------
 MRTK test/Assets/Prefabs/GameObject.prefab    |  94 -----
 MRTK test/Assets/Prefabs/Spline.prefab        | 346 ------------------
 MRTK test/Assets/Scenes/SampleScene.unity     | 171 +++++----
 MRTK test/Assets/Scripts/Calculator2D.cs      | 284 ++++++++++++++
 MRTK test/Assets/Scripts/Calculator3D.cs      | 289 +++++++++++++++
 .../Assets/Scripts/Functions/Customized.cs    |  74 ++++
 MRTK test/Assets/Scripts/Functions/Ellipse.cs |  60 +++
 .../Assets/Scripts/Functions/Exponential.cs   |  57 +++
 .../Assets/Scripts/Functions/Hyperbola.cs     |  84 +++++
 .../Assets/Scripts/Functions/InverseTri.cs    | 123 +++++++
 .../Assets/Scripts/Functions/Logarithmic.cs   |  56 +++
 MRTK test/Assets/Scripts/Functions/Spline.cs  |  65 ++++
 MRTK test/Assets/Scripts/Functions/ThreeD.cs  |  77 ++++
 .../Assets/Scripts/Functions/Trigonometric.cs |  99 +++++
 .../Assets/Scripts/NormalFunctionTest.cs      |   5 +-
 doc/10.27/10.27.md                            |   1 +
 doc/11.10/11.10.md                            |  10 +
 doc/11.3/11.3.md                              |  14 +
 19 files changed, 1392 insertions(+), 850 deletions(-)
 delete mode 100644 MRTK test/Assets/Prefabs/Ellipse.prefab
 delete mode 100644 MRTK test/Assets/Prefabs/GameObject.prefab
 delete mode 100644 MRTK test/Assets/Prefabs/Spline.prefab
 create mode 100644 MRTK test/Assets/Scripts/Calculator2D.cs
 create mode 100644 MRTK test/Assets/Scripts/Calculator3D.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Customized.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Ellipse.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Exponential.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Hyperbola.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/InverseTri.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Logarithmic.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Spline.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/ThreeD.cs
 create mode 100644 MRTK test/Assets/Scripts/Functions/Trigonometric.cs
 create mode 100644 doc/11.10/11.10.md
 create mode 100644 doc/11.3/11.3.md

diff --git a/MRTK test/Assets/Prefabs/Ellipse.prefab b/MRTK test/Assets/Prefabs/Ellipse.prefab
deleted file mode 100644
index 3f83526f..00000000
--- a/MRTK test/Assets/Prefabs/Ellipse.prefab	
+++ /dev/null
@@ -1,333 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1 &1483626023200906509
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 1483626023200906506}
-  - component: {fileID: 1483626023200906505}
-  - component: {fileID: 1483626023200906504}
-  - component: {fileID: 1483626023200906507}
-  m_Layer: 0
-  m_Name: Ellipse
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &1483626023200906506
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1483626023200906509}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: -1.053, y: 0, z: 0.944}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &1483626023200906505
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1483626023200906509}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 094a6569e4454601b5928e64472d5228, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  lineStartClamp: 0.0001
-  lineEndClamp: 0.9999
-  customLineTransform: {fileID: 0}
-  loops: 1
-  transformMode: 0
-  rotationMode: 1
-  flipUpVector: 0
-  originOffset: {x: 0, y: 0, z: 0}
-  manualUpVectorBlend: 0
-  manualUpVectors:
-  - {x: 0, y: 1, z: 0}
-  - {x: 0, y: 1, z: 0}
-  - {x: 0, y: 1, z: 0}
-  velocitySearchRange: 0.02
-  distorters: []
-  distortionEnabled: 1
-  distortionMode: 0
-  distortionStrength:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    - serializedVersion: 3
-      time: 1
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  uniformDistortionStrength: 1
-  resolution: 36
-  radius: {x: 0.5, y: 0.25}
---- !u!120 &1483626023200906504
-LineRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1483626023200906509}
-  m_Enabled: 1
-  m_CastShadows: 0
-  m_ReceiveShadows: 1
-  m_DynamicOccludee: 1
-  m_MotionVectors: 0
-  m_LightProbeUsage: 0
-  m_ReflectionProbeUsage: 0
-  m_RayTracingMode: 0
-  m_RenderingLayerMask: 4294967295
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2100000, guid: ddc1013c5e7bc0841bf61884ea0f39cd, 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: 0
-  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_Positions:
-  - {x: -0.5530001, y: -0.4128429, z: 1.587}
-  - {x: -0.5632943, y: -0.36253142, z: 1.587}
-  - {x: -0.593629, y: -0.3142853, z: 1.587}
-  - {x: -0.642763, y: -0.27007896, z: 1.587}
-  - {x: -0.7086855, y: -0.23172152, z: 1.587}
-  - {x: -0.78869855, y: -0.20078266, z: 1.587}
-  - {x: -0.8795279, y: -0.17852853, z: 1.587}
-  - {x: -0.97745633, y: -0.16586988, z: 1.587}
-  - {x: -1.0784763, y: -0.16332471, z: 1.587}
-  - {x: -1.1784538, y: -0.17099722, z: 1.587}
-  - {x: -1.2732971, y: -0.18857338, z: 1.587}
-  - {x: -1.3591251, y: -0.21533398, z: 1.587}
-  - {x: -1.4324253, y: -0.25018376, z: 1.587}
-  - {x: -1.4901979, y: -0.29169664, z: 1.587}
-  - {x: -1.5300786, y: -0.33817366, z: 1.587}
-  - {x: -1.5504357, y: -0.38771296, z: 1.587}
-  - {x: -1.5504357, y: -0.43828705, z: 1.587}
-  - {x: -1.5300786, y: -0.48782626, z: 1.587}
-  - {x: -1.4901979, y: -0.53430325, z: 1.587}
-  - {x: -1.4324253, y: -0.5758162, z: 1.587}
-  - {x: -1.3591251, y: -0.610666, z: 1.587}
-  - {x: -1.2732972, y: -0.63742656, z: 1.587}
-  - {x: -1.1784538, y: -0.6550027, z: 1.587}
-  - {x: -1.0784763, y: -0.66267526, z: 1.587}
-  - {x: -0.97745633, y: -0.6601301, z: 1.587}
-  - {x: -0.87952805, y: -0.6474715, z: 1.587}
-  - {x: -0.7886987, y: -0.6252173, z: 1.587}
-  - {x: -0.7086854, y: -0.5942784, z: 1.587}
-  - {x: -0.6427631, y: -0.555921, z: 1.587}
-  - {x: -0.59362906, y: -0.5117147, z: 1.587}
-  - {x: -0.5632943, y: -0.46346855, z: 1.587}
-  - {x: -0.5530001, y: -0.41315708, z: 1.587}
-  m_Parameters:
-    serializedVersion: 3
-    widthMultiplier: 0.18
-    widthCurve:
-      serializedVersion: 2
-      m_Curve:
-      - serializedVersion: 3
-        time: 0
-        value: 1
-        inSlope: 0
-        outSlope: 0
-        tangentMode: 0
-        weightedMode: 0
-        inWeight: 0
-        outWeight: 0
-      - serializedVersion: 3
-        time: 1
-        value: 1
-        inSlope: 0
-        outSlope: 0
-        tangentMode: 0
-        weightedMode: 0
-        inWeight: 0
-        outWeight: 0
-      m_PreInfinity: 2
-      m_PostInfinity: 2
-      m_RotationOrder: 4
-    colorGradient:
-      serializedVersion: 2
-      key0: {r: 0.0047169924, g: 0.56144017, b: 1, a: 1}
-      key1: {r: 0.0047169924, g: 0.56144017, b: 1, a: 1}
-      key2: {r: 0, g: 0, b: 0, a: 0}
-      key3: {r: 0, g: 0, b: 0, a: 0}
-      key4: {r: 0, g: 0, b: 0, a: 0}
-      key5: {r: 0, g: 0, b: 0, a: 0}
-      key6: {r: 0, g: 0, b: 0, a: 0}
-      key7: {r: 0, g: 0, b: 0, a: 0}
-      ctime0: 0
-      ctime1: 65535
-      ctime2: 0
-      ctime3: 0
-      ctime4: 0
-      ctime5: 0
-      ctime6: 0
-      ctime7: 0
-      atime0: 0
-      atime1: 65535
-      atime2: 0
-      atime3: 0
-      atime4: 0
-      atime5: 0
-      atime6: 0
-      atime7: 0
-      m_Mode: 0
-      m_NumColorKeys: 2
-      m_NumAlphaKeys: 2
-    numCornerVertices: 8
-    numCapVertices: 8
-    alignment: 0
-    textureMode: 0
-    shadowBias: 0
-    generateLightingData: 0
-  m_UseWorldSpace: 1
-  m_Loop: 1
---- !u!114 &1483626023200906507
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1483626023200906509}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 1287d4d138a242f794bcfc01354d3ae2, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  lineDataSource: {fileID: 1483626023200906505}
-  lineColor:
-    serializedVersion: 2
-    key0: {r: 0.0047169924, g: 0.56144017, b: 1, a: 1}
-    key1: {r: 0.0047169924, g: 0.56144017, b: 1, a: 1}
-    key2: {r: 0, g: 0, b: 0, a: 0}
-    key3: {r: 0, g: 0, b: 0, a: 0}
-    key4: {r: 0, g: 0, b: 0, a: 0}
-    key5: {r: 0, g: 0, b: 0, a: 0}
-    key6: {r: 0, g: 0, b: 0, a: 0}
-    key7: {r: 0, g: 0, b: 0, a: 0}
-    ctime0: 0
-    ctime1: 65535
-    ctime2: 0
-    ctime3: 0
-    ctime4: 0
-    ctime5: 0
-    ctime6: 0
-    ctime7: 0
-    atime0: 0
-    atime1: 65535
-    atime2: 0
-    atime3: 0
-    atime4: 0
-    atime5: 0
-    atime6: 0
-    atime7: 0
-    m_Mode: 0
-    m_NumColorKeys: 2
-    m_NumAlphaKeys: 2
-  lineWidth:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    - serializedVersion: 3
-      time: 1
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  widthMultiplier: 0.18
-  colorOffset: 0
-  widthOffset: 0
-  stepMode: 0
-  lineStepCount: 32
-  pointDistributionMode: 1
-  customPointDistributionLength: 0.1
-  customPointDistributionCurve:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 0
-      inSlope: 0
-      outSlope: 1
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    - serializedVersion: 3
-      time: 1
-      value: 1
-      inSlope: 1
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  lineMaterial: {fileID: 2100000, guid: ddc1013c5e7bc0841bf61884ea0f39cd, type: 2}
-  roundedEdges: 1
-  roundedCaps: 1
-  fadeLineBrightnessOnEnable: 1
-  fadeLinePercentage: 0.55
-  fadeLineAnimationTime: 0.65
-  lineRenderer: {fileID: 1483626023200906504}
-  tileMaterialByWorldLength: 0
-  tileMaterialScale: 1
diff --git a/MRTK test/Assets/Prefabs/GameObject.prefab b/MRTK test/Assets/Prefabs/GameObject.prefab
deleted file mode 100644
index 869bc02a..00000000
--- a/MRTK test/Assets/Prefabs/GameObject.prefab	
+++ /dev/null
@@ -1,94 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1 &7066675710225985741
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 7066675710225985728}
-  - component: {fileID: 7066675710225985731}
-  - component: {fileID: 7066675710225985730}
-  - component: {fileID: 7066675710225985729}
-  m_Layer: 0
-  m_Name: GameObject
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &7066675710225985728
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7066675710225985741}
-  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_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!23 &7066675710225985731
-MeshRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7066675710225985741}
-  m_Enabled: 1
-  m_CastShadows: 1
-  m_ReceiveShadows: 1
-  m_DynamicOccludee: 1
-  m_MotionVectors: 1
-  m_LightProbeUsage: 1
-  m_ReflectionProbeUsage: 1
-  m_RayTracingMode: 2
-  m_RenderingLayerMask: 1
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 0}
-  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
---- !u!33 &7066675710225985730
-MeshFilter:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7066675710225985741}
-  m_Mesh: {fileID: 0}
---- !u!114 &7066675710225985729
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7066675710225985741}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: c6bf611f908edb54cb58db1ada6b1124, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
diff --git a/MRTK test/Assets/Prefabs/Spline.prefab b/MRTK test/Assets/Prefabs/Spline.prefab
deleted file mode 100644
index 027156c3..00000000
--- a/MRTK test/Assets/Prefabs/Spline.prefab	
+++ /dev/null
@@ -1,346 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1 &3367021541490072152
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 3367021541490072102}
-  - component: {fileID: 3367021541490072153}
-  - component: {fileID: 3367021541490072100}
-  - component: {fileID: 3367021541490072103}
-  m_Layer: 0
-  m_Name: Spline
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &3367021541490072102
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 3367021541490072152}
-  m_LocalRotation: {x: 0, y: 1, z: 0, w: 0}
-  m_LocalPosition: {x: -2, y: 0, z: 0.965}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
---- !u!114 &3367021541490072153
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 3367021541490072152}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 4196b75e9e3b4d0c95239473ccc333b8, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  lineStartClamp: 0.0001
-  lineEndClamp: 0.9999
-  customLineTransform: {fileID: 0}
-  loops: 0
-  transformMode: 0
-  rotationMode: 1
-  flipUpVector: 0
-  originOffset: {x: 0, y: 0, z: 0}
-  manualUpVectorBlend: 0
-  manualUpVectors:
-  - {x: 0, y: 1, z: 0}
-  - {x: 0, y: 1, z: 0}
-  velocitySearchRange: 0.02
-  distorters: []
-  distortionEnabled: 1
-  distortionMode: 0
-  distortionStrength:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    - serializedVersion: 3
-      time: 1
-      value: 1
-      inSlope: 0
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  uniformDistortionStrength: 1
-  controlPoints:
-  - position: {x: 0, y: 0, z: 0}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: 0.5928917, y: 0.0418154, z: 0.0034427047}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: 0.47503617, y: 0.3083095, z: 0.5011646}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: 0, y: 0.5, z: 0.5}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: -0.44839406, y: 0.6809397, z: 0.49890068}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: -0.49537897, y: 0.78584373, z: 0.007106304}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  - position: {x: 0, y: 1, z: 0}
-    rotation: {x: 0, y: 0, z: 0, w: 1}
-  alignAllControlPoints: 1
---- !u!120 &3367021541490072100
-LineRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 3367021541490072152}
-  m_Enabled: 1
-  m_CastShadows: 0
-  m_ReceiveShadows: 1
-  m_DynamicOccludee: 1
-  m_MotionVectors: 0
-  m_LightProbeUsage: 0
-  m_ReflectionProbeUsage: 0
-  m_RayTracingMode: 0
-  m_RenderingLayerMask: 4294967295
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2100000, guid: ddc1013c5e7bc0841bf61884ea0f39cd, 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: 0
-  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_Positions:
-  - {x: -2.0003557, y: -0.41297486, z: 1.6079979}
-  - {x: -2.106255, y: -0.40214247, z: 1.6013929}
-  - {x: -2.1949825, y: -0.38618496, z: 1.5840528}
-  - {x: -2.2671075, y: -0.36558452, z: 1.5575771}
-  - {x: -2.323199, y: -0.34082347, z: 1.5235649}
-  - {x: -2.3638265, y: -0.31238395, z: 1.4836156}
-  - {x: -2.3895595, y: -0.2807483, z: 1.4393282}
-  - {x: -2.400967, y: -0.24639878, z: 1.3923023}
-  - {x: -2.3986185, y: -0.20981754, z: 1.3441367}
-  - {x: -2.3830833, y: -0.17148685, z: 1.2964311}
-  - {x: -2.3549309, y: -0.13188899, z: 1.2507844}
-  - {x: -2.3147306, y: -0.09150618, z: 1.208796}
-  - {x: -2.2630515, y: -0.05082071, z: 1.1720653}
-  - {x: -2.200463, y: -0.010314673, z: 1.1421912}
-  - {x: -2.1275346, y: 0.029529482, z: 1.1207733}
-  - {x: -2.0448356, y: 0.068229645, z: 1.1094108}
-  - {x: -1.9578731, y: 0.10427576, z: 1.1096048}
-  - {x: -1.8812482, y: 0.13755274, z: 1.1212165}
-  - {x: -1.8149846, y: 0.16937917, z: 1.1427219}
-  - {x: -1.7593092, y: 0.2000534, z: 1.1725506}
-  - {x: -1.7144489, y: 0.2298736, z: 1.2091317}
-  - {x: -1.6806309, y: 0.25913835, z: 1.2508949}
-  - {x: -1.6580819, y: 0.2881459, z: 1.2962692}
-  - {x: -1.6470289, y: 0.31719482, z: 1.3436844}
-  - {x: -1.6476992, y: 0.34658313, z: 1.3915696}
-  - {x: -1.6603196, y: 0.37660939, z: 1.4383541}
-  - {x: -1.6851168, y: 0.4075719, z: 1.4824675}
-  - {x: -1.7223182, y: 0.4397692, z: 1.5223393}
-  - {x: -1.7721504, y: 0.47349942, z: 1.5563985}
-  - {x: -1.8348407, y: 0.5090609, z: 1.5830748}
-  - {x: -1.9106157, y: 0.54675215, z: 1.6007974}
-  - {x: -1.9997029, y: 0.58687156, z: 1.6079956}
-  m_Parameters:
-    serializedVersion: 3
-    widthMultiplier: 0.42
-    widthCurve:
-      serializedVersion: 2
-      m_Curve:
-      - serializedVersion: 3
-        time: 0
-        value: 0
-        inSlope: 2.1987011
-        outSlope: 2.1987011
-        tangentMode: 0
-        weightedMode: 0
-        inWeight: 0
-        outWeight: 0.16707118
-      - serializedVersion: 3
-        time: 1
-        value: 0.006248474
-        inSlope: -1.8448529
-        outSlope: -1.8448529
-        tangentMode: 0
-        weightedMode: 0
-        inWeight: 0.18141192
-        outWeight: 0
-      m_PreInfinity: 2
-      m_PostInfinity: 2
-      m_RotationOrder: 4
-    colorGradient:
-      serializedVersion: 2
-      key0: {r: 0.6292379, g: 0.37166253, b: 0.9056604, a: 1}
-      key1: {r: 1, g: 0, b: 0, a: 1}
-      key2: {r: 0, g: 0, b: 0, a: 0}
-      key3: {r: 0, g: 0, b: 0, a: 0}
-      key4: {r: 0, g: 0, b: 0, a: 0}
-      key5: {r: 0, g: 0, b: 0, a: 0}
-      key6: {r: 0, g: 0, b: 0, a: 0}
-      key7: {r: 0, g: 0, b: 0, a: 0}
-      ctime0: 0
-      ctime1: 65535
-      ctime2: 0
-      ctime3: 0
-      ctime4: 0
-      ctime5: 0
-      ctime6: 0
-      ctime7: 0
-      atime0: 0
-      atime1: 65535
-      atime2: 0
-      atime3: 0
-      atime4: 0
-      atime5: 0
-      atime6: 0
-      atime7: 0
-      m_Mode: 0
-      m_NumColorKeys: 2
-      m_NumAlphaKeys: 2
-    numCornerVertices: 8
-    numCapVertices: 8
-    alignment: 0
-    textureMode: 0
-    shadowBias: 0
-    generateLightingData: 0
-  m_UseWorldSpace: 1
-  m_Loop: 0
---- !u!114 &3367021541490072103
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 3367021541490072152}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 1287d4d138a242f794bcfc01354d3ae2, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  lineDataSource: {fileID: 3367021541490072153}
-  lineColor:
-    serializedVersion: 2
-    key0: {r: 0.6292379, g: 0.37166253, b: 0.9056604, a: 1}
-    key1: {r: 1, g: 0, b: 0, a: 1}
-    key2: {r: 0, g: 0, b: 0, a: 0}
-    key3: {r: 0, g: 0, b: 0, a: 0}
-    key4: {r: 0, g: 0, b: 0, a: 0}
-    key5: {r: 0, g: 0, b: 0, a: 0}
-    key6: {r: 0, g: 0, b: 0, a: 0}
-    key7: {r: 0, g: 0, b: 0, a: 0}
-    ctime0: 0
-    ctime1: 65535
-    ctime2: 0
-    ctime3: 0
-    ctime4: 0
-    ctime5: 0
-    ctime6: 0
-    ctime7: 0
-    atime0: 0
-    atime1: 65535
-    atime2: 0
-    atime3: 0
-    atime4: 0
-    atime5: 0
-    atime6: 0
-    atime7: 0
-    m_Mode: 0
-    m_NumColorKeys: 2
-    m_NumAlphaKeys: 2
-  lineWidth:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 0
-      inSlope: 2.1987011
-      outSlope: 2.1987011
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0.16707118
-    - serializedVersion: 3
-      time: 1
-      value: 0.006248474
-      inSlope: -1.8448529
-      outSlope: -1.8448529
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0.18141192
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  widthMultiplier: 0.42
-  colorOffset: 0
-  widthOffset: 0
-  stepMode: 0
-  lineStepCount: 32
-  pointDistributionMode: 1
-  customPointDistributionLength: 0.1
-  customPointDistributionCurve:
-    serializedVersion: 2
-    m_Curve:
-    - serializedVersion: 3
-      time: 0
-      value: 0
-      inSlope: 0
-      outSlope: 1
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    - serializedVersion: 3
-      time: 1
-      value: 1
-      inSlope: 1
-      outSlope: 0
-      tangentMode: 0
-      weightedMode: 0
-      inWeight: 0
-      outWeight: 0
-    m_PreInfinity: 2
-    m_PostInfinity: 2
-    m_RotationOrder: 4
-  lineMaterial: {fileID: 2100000, guid: ddc1013c5e7bc0841bf61884ea0f39cd, type: 2}
-  roundedEdges: 1
-  roundedCaps: 1
-  fadeLineBrightnessOnEnable: 1
-  fadeLinePercentage: 0.55
-  fadeLineAnimationTime: 0.65
-  lineRenderer: {fileID: 3367021541490072100}
-  tileMaterialByWorldLength: 0
-  tileMaterialScale: 1
diff --git a/MRTK test/Assets/Scenes/SampleScene.unity b/MRTK test/Assets/Scenes/SampleScene.unity
index 16b7301e..839f70fc 100644
--- a/MRTK test/Assets/Scenes/SampleScene.unity	
+++ b/MRTK test/Assets/Scenes/SampleScene.unity	
@@ -121,6 +121,103 @@ NavMeshSettings:
     debug:
       m_Flags: 0
   m_NavMeshData: {fileID: 0}
+--- !u!1 &384968185
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 384968189}
+  - component: {fileID: 384968188}
+  - component: {fileID: 384968187}
+  - component: {fileID: 384968186}
+  m_Layer: 0
+  m_Name: GameObject
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &384968186
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384968185}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a6c90b73b6862d24b9b9bd76ad26b47b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  formula: x + y
+  minX: -1
+  maxX: 1
+  minY: -1
+  maxY: 1
+--- !u!33 &384968187
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384968185}
+  m_Mesh: {fileID: 4300018, guid: a37785fa4a4129246a58f79132a1b6c6, type: 3}
+--- !u!23 &384968188
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384968185}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 0}
+  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
+--- !u!4 &384968189
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384968185}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 9.43}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &595124460
 GameObject:
   m_ObjectHideFlags: 0
@@ -431,77 +528,3 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1001 &1782433715
-PrefabInstance:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_Modification:
-    m_TransformParent: {fileID: 0}
-    m_Modifications:
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalPosition.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalPosition.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalPosition.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalRotation.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalRotation.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalRotation.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalRotation.w
-      value: 1
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_RootOrder
-      value: 3
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalEulerAnglesHint.x
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalEulerAnglesHint.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985728, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_LocalEulerAnglesHint.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 7066675710225985730, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_Mesh
-      value: 
-      objectReference: {fileID: 4300018, guid: a37785fa4a4129246a58f79132a1b6c6, type: 3}
-    - target: {fileID: 7066675710225985741, guid: 6de4f243439a6ea4597b0d1d34e14ef9,
-        type: 3}
-      propertyPath: m_Name
-      value: GameObject
-      objectReference: {fileID: 0}
-    m_RemovedComponents: []
-  m_SourcePrefab: {fileID: 100100000, guid: 6de4f243439a6ea4597b0d1d34e14ef9, type: 3}
diff --git a/MRTK test/Assets/Scripts/Calculator2D.cs b/MRTK test/Assets/Scripts/Calculator2D.cs
new file mode 100644
index 00000000..ed9d67f1
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Calculator2D.cs	
@@ -0,0 +1,284 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Calculator2D
+{
+    public static float x;
+
+    public float getNum(string s, ref int index)
+    {
+        bool end = false;
+        string num = "";
+
+        while(!end && index < s.Length)
+        {
+            if ((s[index] >= '0' && s[index] <= '9') || s[index] == '.')
+            {
+                num += s[index];
+                index++;
+            }
+            else
+                break;
+        }
+        index--;
+        return float.Parse(num);
+    }
+    //'('-0, '+-'-1,'*/'-2,'sct^l'-3
+    private bool calculateStack(int prior, ref Stack<float> numstack, ref Stack<char> opstack)
+    {
+        while(opstack.Count > 0)
+        {
+            char operater = opstack.Peek();
+            float num1;
+            float num2;
+            switch (operater)
+            {
+                case '+':
+                    if (prior == 1 || prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 + num1);
+                    break;
+                case '-':
+                    if (prior == 1 || prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 - num1);
+                    break;
+                case '*':
+                    if (prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 * num1);
+                    break;
+                case '/':
+                    if (prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    if (num1 == 0)
+                        return false;
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 / num1);
+                    break;
+                case '(':
+                    if(prior == 0)
+                        opstack.Pop();
+                    return true;
+                case 's':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Sin(num1));
+                    break;
+                case 'c':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Cos(num1));
+                    break;
+                case 't':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Tan(num1));
+                    break;
+                case '^':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Pow(num2, num1));
+                    break;
+                case 'l':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    if(num1 <= 0)
+                        return false;
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    if(num2 <=0 || num2 == 1)
+                        return false;
+                    numstack.Push(Mathf.Log(num1, num2));
+                    break;
+                default:
+                    break;
+            }
+        }
+        return true;
+    }
+
+    public bool calculate2D(string s, float xIn, out float yOut)
+    {
+        x = xIn;
+        yOut = 0;
+        Stack<char> opstack = new Stack<char>();
+        Stack<float> numstack = new Stack<float>();
+        int length = s.Length;
+        int index;
+        char peek;
+
+        for (index = 0; index < length; ++index)
+        {
+            if(s[index] == '+' || s[index] == '-')
+            {
+                if(index == 0)
+                {
+                    s = "0" + s;
+                    length++;
+                }
+                else
+                {
+                    if(s[index - 1] == '(')
+                    {
+                        s.Insert(index - 1, "0");
+                        length++;
+                    }
+                }
+            }
+        }
+
+        index = 0;
+
+        while (index < length)
+        {
+            Debug.Log(s[index]);
+            switch (s[index])
+            {
+                case '0':
+                case '1':
+                case '2':
+                case '3':
+                case '4':
+                case '5':
+                case '6':
+                case '7':
+                case '8':
+                case '9':
+                    numstack.Push(getNum(s, ref index));
+                    break;
+                case 'x':
+                    numstack.Push(x);
+                    break;
+                case '(':
+                    opstack.Push('(');
+                    break;
+                case ')':
+                    if(!calculateStack(0, ref numstack, ref opstack))
+                        return false;
+                    break;
+                case '+':
+                    if(opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-')
+                        {
+                            if (!calculateStack(1, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('+');
+                    break;
+                case '-':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-')
+                        {
+                            if (!calculateStack(1, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('-');
+                    break;
+                case '*':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-' && peek != '*' && peek != '/')
+                        {
+                            if (!calculateStack(2, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('*');
+                    break;
+                case '/':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-' && peek != '*' && peek != '/')
+                        {
+                            if (!calculateStack(2, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('/');
+                    break;
+                case 's':
+                    if (s[index + 1] == 'i' && s[index + 2] == 'n' && s[index + 3] == '(')
+                    {
+                        opstack.Push('s');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case 'c':
+                    if (s[index + 1] == 'o' && s[index + 2] == 's' && s[index + 3] == '(')
+                    {
+                        opstack.Push('c');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case 't':
+                    if (s[index + 1] == 'a' && s[index + 2] == 'n' && s[index + 3] == '(')
+                    {
+                        opstack.Push('t');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case '^':
+                    opstack.Push('^');
+                    break;
+                case 'l':
+                    if (s[index + 1] == 'o' && s[index + 2] == 'g' && s[index + 3] == '(')
+                    {
+                        opstack.Push('l');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                default:
+                    break;
+            }
+            index++;
+        }
+        while(opstack.Count > 0)
+        {
+            calculateStack(3, ref numstack, ref opstack);
+        }
+        yOut = numstack.Peek();
+        return true;
+    }
+
+}
diff --git a/MRTK test/Assets/Scripts/Calculator3D.cs b/MRTK test/Assets/Scripts/Calculator3D.cs
new file mode 100644
index 00000000..a47acb09
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Calculator3D.cs	
@@ -0,0 +1,289 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Calculator3D
+{
+    public static float x;
+    public static float y;
+
+    public float getNum(string s, ref int index)
+    {
+        bool end = false;
+        string num = "";
+
+        while (!end && index < s.Length)
+        {
+            if ((s[index] >= '0' && s[index] <= '9') || s[index] == '.')
+            {
+                num += s[index];
+                index++;
+            }
+            else
+                break;
+        }
+        index--;
+        return float.Parse(num);
+    }
+    //'('-0, '+-'-1,'*/'-2,'sct^l'-3
+    private bool calculateStack(int prior, ref Stack<float> numstack, ref Stack<char> opstack)
+    {
+        while (opstack.Count > 0)
+        {
+            char operater = opstack.Peek();
+            float num1;
+            float num2;
+            switch (operater)
+            {
+                case '+':
+                    if (prior == 1 || prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 + num1);
+                    break;
+                case '-':
+                    if (prior == 1 || prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 - num1);
+                    break;
+                case '*':
+                    if (prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 * num1);
+                    break;
+                case '/':
+                    if (prior == 2)
+                        return true;
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    if (num1 == 0)
+                        return false;
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(num2 / num1);
+                    break;
+                case '(':
+                    if (prior == 0)
+                        opstack.Pop();
+                    return true;
+                case 's':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Sin(num1));
+                    break;
+                case 'c':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Cos(num1));
+                    break;
+                case 't':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Tan(num1));
+                    break;
+                case '^':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    numstack.Push(Mathf.Pow(num2, num1));
+                    break;
+                case 'l':
+                    opstack.Pop();
+                    num1 = numstack.Peek();
+                    numstack.Pop();
+                    if (num1 <= 0)
+                        return false;
+                    num2 = numstack.Peek();
+                    numstack.Pop();
+                    if (num2 <= 0 || num2 == 1)
+                        return false;
+                    numstack.Push(Mathf.Log(num1, num2));
+                    break;
+                default:
+                    break;
+            }
+        }
+        return true;
+    }
+
+    public bool calculate3D(string s, float xIn, float yIn, out float zOut)
+    {
+        x = xIn;
+        y = yIn;
+        zOut = 0;
+        Stack<char> opstack = new Stack<char>();
+        Stack<float> numstack = new Stack<float>();
+        int length = s.Length;
+        int index;
+        char peek;
+
+        for (index = 0; index < length; ++index)
+        {
+            if (s[index] == '+' || s[index] == '-')
+            {
+                if (index == 0)
+                {
+                    s = "0" + s;
+                    length++;
+                }
+                else
+                {
+                    if (s[index - 1] == '(')
+                    {
+                        s.Insert(index - 1, "0");
+                        length++;
+                    }
+                }
+            }
+        }
+
+        index = 0;
+
+        while (index < length)
+        {
+            switch (s[index])
+            {
+                case '0':
+                case '1':
+                case '2':
+                case '3':
+                case '4':
+                case '5':
+                case '6':
+                case '7':
+                case '8':
+                case '9':
+                    numstack.Push(getNum(s, ref index));
+                    break;
+                case 'x':
+                    numstack.Push(x);
+                    break;
+                case 'y':
+                    numstack.Push(y);
+                    break;
+                case '(':
+                    opstack.Push('(');
+                    break;
+                case ')':
+                    if (!calculateStack(0, ref numstack, ref opstack))
+                        return false;
+                    break;
+                case '+':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-')
+                        {
+                            if (!calculateStack(1, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('+');
+                    break;
+                case '-':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-')
+                        {
+                            if (!calculateStack(1, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('-');
+                    break;
+                case '*':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-' && peek != '*' && peek != '/')
+                        {
+                            if (!calculateStack(2, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('*');
+                    break;
+                case '/':
+                    if (opstack.Count != 0)
+                    {
+                        peek = opstack.Peek();
+                        if (peek != '+' && peek != '-' && peek != '*' && peek != '/')
+                        {
+                            if (!calculateStack(2, ref numstack, ref opstack))
+                                return false;
+                        }
+                    }
+                    opstack.Push('/');
+                    break;
+                case 's':
+                    if (s[index + 1] == 'i' && s[index + 2] == 'n' && s[index + 3] == '(')
+                    {
+                        opstack.Push('s');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case 'c':
+                    if (s[index + 1] == 'o' && s[index + 2] == 's' && s[index + 3] == '(')
+                    {
+                        opstack.Push('c');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case 't':
+                    if (s[index + 1] == 'a' && s[index + 2] == 'n' && s[index + 3] == '(')
+                    {
+                        opstack.Push('t');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                case '^':
+                    opstack.Push('^');
+                    break;
+                case 'l':
+                    if (s[index + 1] == 'o' && s[index + 2] == 'g' && s[index + 3] == '(')
+                    {
+                        opstack.Push('l');
+                        opstack.Push('(');
+                        index += 3;
+                    }
+                    break;
+                default:
+                    break;
+            }
+            index++;
+        }
+        while (opstack.Count > 0)
+        {
+            calculateStack(3, ref numstack, ref opstack);
+        }
+        zOut = numstack.Peek();
+        //Debug.Log(x.ToString() + "," + y.ToString() + "=" + zOut.ToString());
+        return true;
+    }
+
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Customized.cs b/MRTK test/Assets/Scripts/Functions/Customized.cs
new file mode 100644
index 00000000..ca6acb47
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Customized.cs	
@@ -0,0 +1,74 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Customized : MonoBehaviour
+{
+    Mesh mesh;
+
+    Calculator2D calculator2D;
+
+    public string formula;
+
+    public int minX;
+    public int maxX;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Customized"
+        };
+        calculator2D = new Calculator2D();
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawCustomized()
+    {
+        mesh.Clear();
+
+        bool isContinue = false;
+
+        Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1];
+        int[] triangle = new int[100 * (maxX - minX) * 2];
+        int k = 0;
+        float step = 0.01f;
+        for (float i = minX; i <= maxX + 0.01f; i += step)
+        {
+            float y = 0;
+            if(calculator2D.calculate2D(formula, i ,out y))
+            {
+                vectors[k] = new Vector3(i, y, 0);
+                if (isContinue)
+                {
+                    triangle[2 * (k - 1)] = k - 1;
+                    triangle[2 * (k - 1) + 1] = k;
+                }
+                else
+                {
+                    triangle[2 * (k - 1)] = k;
+                    triangle[2 * (k - 1) + 1] = k;
+                }
+                isContinue = true;
+            }
+            else
+            {
+                if (k != 0)
+                    vectors[k] = vectors[k - 1];
+                else
+                    vectors[k] = new Vector3(0, 0, -1000);
+                isContinue = false;
+            }
+            k++;
+        }
+        mesh.vertices = vectors;
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Ellipse.cs b/MRTK test/Assets/Scripts/Functions/Ellipse.cs
new file mode 100644
index 00000000..b37aa8da
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Ellipse.cs	
@@ -0,0 +1,60 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Ellipse : MonoBehaviour
+{
+    Mesh mesh;
+    public Vector3 center;
+    public float a;
+    public float b;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Ellipse"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawEllipse()
+    {
+        mesh.Clear();
+
+        Vector3[] vectors = new Vector3[200];
+        int k = 0;
+        float step = a / 50;
+        for (float i = -a; i <= a; i += step)
+        {
+            float y = 1 - i * i / (a * a);
+            y *= (b * b);
+            y = Mathf.Sqrt(y);
+            vectors[k] = new Vector3(i, y, 0);
+            if (y != 0)
+            {
+                vectors[200 - k] = new Vector3(i, -y, 0);
+            }
+            k++;
+        }
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[400];
+        for (int i = 0; i < vectors.Length - 1; ++i)
+        {
+            triangle[2 * i] = i;
+            triangle[2 * i + 1] = i + 1;
+        }
+        triangle[398] = 199;
+        triangle[399] = 0;
+
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Exponential.cs b/MRTK test/Assets/Scripts/Functions/Exponential.cs
new file mode 100644
index 00000000..a59ce72e
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Exponential.cs	
@@ -0,0 +1,57 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Exponential : MonoBehaviour
+{
+    Mesh mesh;
+
+    public int minX;
+    public int maxX;
+
+    public float factor;
+    public float c;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Exponential"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawExponential()
+    {
+        mesh.Clear();
+
+        float step = 0.01f;
+        Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1];
+        int k = 0;
+        for (float i = minX; i <= maxX; i = i + step)
+        {
+            float y = Mathf.Pow(c, i);
+            y *= factor;
+            vectors[k] = new Vector3(i, y, 0);
+            k++;
+        }
+        vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Pow(c, maxX) * factor, 0);
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[100 * (maxX - minX) * 2];
+        for (int i = 0; i < vectors.Length - 1; ++i)
+        {
+            triangle[2 * i] = i;
+            triangle[2 * i + 1] = i + 1;
+        }
+
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Hyperbola.cs b/MRTK test/Assets/Scripts/Functions/Hyperbola.cs
new file mode 100644
index 00000000..5a39912f
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Hyperbola.cs	
@@ -0,0 +1,84 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Hyperbola : MonoBehaviour
+{
+    Mesh mesh;
+    public Vector3 center;
+    public float a;
+    public float b;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Hyperbola"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawHyperbola()
+    {
+        mesh.Clear();
+
+        Vector3[] vectors = new Vector3[202];
+        int k = 0;
+        float step = a / 100;
+        float x = -a;
+        while (k < 51)
+        {
+            float y = x * x / (a * a) - 1;
+            y *= (b * b);
+            y = Mathf.Sqrt(y);
+            vectors[50 + k] = new Vector3(x, y, 0);
+            if (y != 0)
+            {
+                vectors[50 - k] = new Vector3(x, -y, 0);
+            }
+            x -= step;
+            step *= 1.1f;
+            k++;
+        }
+
+        x = a;
+        step = a / 100;
+        k = 0;
+        while (k < 51)
+        {
+            float y = x * x / (a * a) - 1;
+            y *= (b * b);
+            y = Mathf.Sqrt(y);
+            vectors[151 + k] = new Vector3(x, y, 0);
+            if (y != 0)
+            {
+                vectors[151 - k] = new Vector3(x, -y, 0);
+            }
+            x += step;
+            step *= 1.1f;
+            k++;
+        }
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[400];
+        for (int i = 0; i < 100; ++i)
+        {
+            triangle[2 * i] = i;
+            triangle[2 * i + 1] = i + 1;
+        }
+        for (int i = 100; i < 200; ++i)
+        {
+            triangle[2 * i] = i + 1;
+            triangle[2 * i + 1] = i + 2;
+        }
+
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/InverseTri.cs b/MRTK test/Assets/Scripts/Functions/InverseTri.cs
new file mode 100644
index 00000000..b603227e
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/InverseTri.cs	
@@ -0,0 +1,123 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class InverseTri : MonoBehaviour
+{
+    Mesh mesh;
+
+    public int minX;
+    public int maxX;
+    public enum InverseTriTpye
+    {
+        Arcsin,
+        Arccos,
+        Arctan
+    }
+
+    public InverseTriTpye inverseTriTpye;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "InverseTri"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawInverseTri()
+    {
+        mesh.Clear();
+
+        if(inverseTriTpye != InverseTriTpye.Arctan)
+        {
+            float step = 0.01f;
+            Vector3[] vectors = new Vector3[100 * 2 + 1];
+            int k = 0;
+            for (float i = -1; i <= 1; i = i + step)
+            {
+                float y = i;
+                switch (inverseTriTpye)
+                {
+                    case InverseTriTpye.Arcsin:
+                        y = Mathf.Asin(y);
+                        break;
+                    case InverseTriTpye.Arccos:
+                        y = Mathf.Acos(y);
+                        break;
+                    default:
+                        break;
+                }
+                vectors[k] = new Vector3(i, y, 0);
+                k++;
+            }
+            switch (inverseTriTpye)
+            {
+                case InverseTriTpye.Arcsin:
+                    vectors[100 * 2] = new Vector3(1, Mathf.Asin(1), 0);
+                    break;
+                case InverseTriTpye.Arccos:
+                    vectors[100 * 2] = new Vector3(1, Mathf.Acos(1), 0);
+                    break;
+                default:
+                    break;
+            }
+            mesh.vertices = vectors;
+
+            int[] triangle = new int[100 * 2 * 2];
+            for (int i = 0; i < vectors.Length - 1; ++i)
+            {
+                if (vectors[i].y * vectors[i + 1].y >= 0)
+                {
+                    triangle[2 * i] = i;
+                    triangle[2 * i + 1] = i + 1;
+                }
+                else
+                {
+                    triangle[2 * i] = i;
+                    triangle[2 * i + 1] = i;
+                }
+            }
+            mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+        }
+        else
+        {
+            float step = 0.01f;
+            Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1];
+            int k = 0;
+            for (float i = -1; i <= 1; i = i + step)
+            {
+                float y = i;
+                y = Mathf.Atan(y);
+                vectors[k] = new Vector3(i, y, 0);
+                k++;
+            }
+            vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Atan(maxX), 0);
+            mesh.vertices = vectors;
+
+            int[] triangle = new int[100 * (maxX - minX) * 2];
+            for (int i = 0; i < vectors.Length - 1; ++i)
+            {
+                if (vectors[i].y * vectors[i + 1].y >= 0)
+                {
+                    triangle[2 * i] = i;
+                    triangle[2 * i + 1] = i + 1;
+                }
+                else
+                {
+                    triangle[2 * i] = i;
+                    triangle[2 * i + 1] = i;
+                }
+            }
+            mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+        }
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Logarithmic.cs b/MRTK test/Assets/Scripts/Functions/Logarithmic.cs
new file mode 100644
index 00000000..0de48cf8
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Logarithmic.cs	
@@ -0,0 +1,56 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Logarithmic : MonoBehaviour
+{
+    Mesh mesh;
+
+    public int maxX;
+    public float factor;
+    public float a;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Logarithmic"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawLogarithmic()
+    {
+        mesh.Clear();
+
+        float step = 0.01f;
+        Vector3[] vectors = new Vector3[100 * maxX];
+        int k = 0;
+        float down = Mathf.Log(a);
+        for (float i = step; i <= maxX; i = i + step)
+        {
+            float y = Mathf.Log(i) / down;
+            y *= factor;
+            vectors[k] = new Vector3(i, y, 0);
+            k++;
+        }
+        vectors[100 * maxX - 1] = new Vector3(maxX, Mathf.Log(maxX) / down * factor, 0);
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[100 * maxX * 2 - 2];
+        for (int i = 0; i < vectors.Length - 1; ++i)
+        {
+            triangle[2 * i] = i;
+            triangle[2 * i + 1] = i + 1;
+        }
+
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Spline.cs b/MRTK test/Assets/Scripts/Functions/Spline.cs
new file mode 100644
index 00000000..8434cd4f
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Spline.cs	
@@ -0,0 +1,65 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Spline : MonoBehaviour
+{
+    Mesh mesh;
+
+    public int minX;
+    public int maxX;
+
+    public List<float> factors;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Spline"
+        };
+        factors = new List<float>();
+        factors.Add(1);
+        factors.Add(0);
+        factors.Add(1);
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawSpline()
+    {
+        mesh.Clear();
+
+        Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1];
+        int k = 0;
+        float step = 0.01f;
+        for (float i = minX; i <= maxX; i+=step)
+        {
+            float y = 0;
+            for (int j = factors.Count - 1; j > 0; --j)
+            {
+                y += factors[j];
+                y *= i;
+            }
+            y += factors[0];
+            vectors[k] = new Vector3(i, y, 0);
+            k++;
+        }
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[100 * (maxX - minX) * 2];
+        for (int i = 0; i < vectors.Length - 1; ++i)
+        {
+            triangle[2 * i] = i;
+            triangle[2 * i + 1] = i + 1;
+        }
+
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+
+}
diff --git a/MRTK test/Assets/Scripts/Functions/ThreeD.cs b/MRTK test/Assets/Scripts/Functions/ThreeD.cs
new file mode 100644
index 00000000..5ca0c6dd
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/ThreeD.cs	
@@ -0,0 +1,77 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ThreeD : MonoBehaviour
+{
+    Mesh mesh;
+
+    Calculator3D calculator3D;
+
+    public string formula;
+
+    public int minX;
+    public int maxX;
+    public int minY;
+    public int maxY;
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "ThreeD"
+        };
+        calculator3D = new Calculator3D();
+        DrawCustomized();
+    }
+
+    // Update is called once per frame
+    public void DrawCustomized()
+    {
+        mesh.Clear();
+
+        Vector3[] vectors = new Vector3[(10 * (maxX - minX) + 1) * (10 * (maxY - minY) + 1)];
+        int[] triangle = new int[100 * (maxX - minX) * (maxY - minY) * 2 * 3];
+        int k = 0;
+        float step = 0.1f;
+        for(float i = minX; i <= maxX + 0.01f; i += step)
+        {
+            for(float j = minY; j <= maxY + 0.01f; j += step)
+            {
+                float z = 0;
+                if(calculator3D.calculate3D(formula, i, j, out z))
+                {
+                    vectors[k] = new Vector3(i, j, z);
+                }
+                else
+                {
+                    vectors[k] = vectors[k - 1];
+                }
+                ++k;
+            }
+        }
+
+        int lineCount = 10 * (maxY - minY) + 1;
+        int line = 0;
+        for(int i = 0; i < lineCount - 1; ++i)
+        {
+            i *= lineCount;
+            for(int j = 0; j < lineCount - 1; ++j)
+            {
+                triangle[6 * (i + j - line)] = (i + j);
+                triangle[6 * (i + j - line) + 1] = (i + j) + 1;
+                triangle[6 * (i + j - line) + 2] = (i + j) + lineCount;
+                triangle[6 * (i + j - line) + 3] = (i + j) + 1; ;
+                triangle[6 * (i + j - line) + 4] = (i + j) + lineCount + 1;
+                triangle[6 * (i + j - line) + 5] = (i + j) + lineCount;
+            }
+            i /= lineCount;
+            line++;
+        }
+
+        mesh.vertices = vectors;
+        mesh.SetIndices(triangle, MeshTopology.Triangles, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/Functions/Trigonometric.cs b/MRTK test/Assets/Scripts/Functions/Trigonometric.cs
new file mode 100644
index 00000000..f19314df
--- /dev/null
+++ b/MRTK test/Assets/Scripts/Functions/Trigonometric.cs	
@@ -0,0 +1,99 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Trigonometric : MonoBehaviour
+{
+    Mesh mesh;
+
+    public int minX;
+    public int maxX;
+
+    public TriType triType;
+    public float a;
+    public float b;
+    public float factor;
+    public enum TriType
+    {
+        Sin,
+        Cos,
+        Tan
+    }
+    // Start is called before the first frame update
+    void Start()
+    {
+        mesh = new Mesh
+        {
+            name = "Trigonometric"
+        };
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+
+    public void DrawTrigonometric()
+    {
+        mesh.Clear();
+
+        float step = 0.01f;
+        Vector3[] vectors = new Vector3[100 * (maxX - minX) + 1];
+        int k = 0;
+        for (float i = minX; i <= maxX; i = i + step)
+        {
+            float y = a * i + b;
+            switch (triType)
+            {
+                case TriType.Sin:
+                    y = Mathf.Sin(y);
+                    break;
+                case TriType.Cos:
+                    y = Mathf.Cos(y);
+                    break;
+                case TriType.Tan:
+                    y = Mathf.Tan(y);
+                    break;
+                default:
+                    break;
+            }
+            y *= factor;
+            vectors[k] = new Vector3(i, y, 0);
+            k++;
+        }
+        switch (triType)
+        {
+            case TriType.Sin:
+                vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Sin(a * maxX + b) * factor, 0);
+                break;
+            case TriType.Cos:
+                vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Cos(a * maxX + b) * factor, 0);
+                break;
+            case TriType.Tan:
+                vectors[100 * (maxX - minX)] = new Vector3(maxX, Mathf.Tan(a * maxX + b) * factor, 0);
+                break;
+            default:
+                break;
+        }
+        mesh.vertices = vectors;
+
+        int[] triangle = new int[100 * (maxX - minX) * 2];
+        for (int i = 0; i < vectors.Length - 1; ++i)
+        {
+            if(vectors[i].y * vectors[i + 1].y >= 0)
+            {
+                triangle[2 * i] = i;
+                triangle[2 * i + 1] = i + 1;
+            }
+            else
+            {
+                triangle[2 * i] = i;
+                triangle[2 * i + 1] = i;
+            }
+        }
+        mesh.SetIndices(triangle, MeshTopology.Lines, 0);
+
+        GetComponent<MeshFilter>().mesh = mesh;
+    }
+}
diff --git a/MRTK test/Assets/Scripts/NormalFunctionTest.cs b/MRTK test/Assets/Scripts/NormalFunctionTest.cs
index 1f76f559..b5057cb2 100644
--- a/MRTK test/Assets/Scripts/NormalFunctionTest.cs	
+++ b/MRTK test/Assets/Scripts/NormalFunctionTest.cs	
@@ -53,9 +53,8 @@ public class NormalFunctionTest : MonoBehaviour
         //DrawHyperbola(new Vector3(0, 0, 0), 3, 2);
         //DrawExponential(2, 3);
         //DrawLogarithmic(2, 3);
-        DrawTrigonometric(TriType.Sin, 1, 0, 1);
-
-
+        //DrawTrigonometric(TriType.Sin, 1, 0, 1);
+        
     }
 
     // Update is called once per frame
diff --git a/doc/10.27/10.27.md b/doc/10.27/10.27.md
index f260e4cc..e1e469c8 100644
--- a/doc/10.27/10.27.md
+++ b/doc/10.27/10.27.md
@@ -13,6 +13,7 @@
       * 灏� Windows 鍜� HoloLens2 杩炴帴鍦ㄥ悓涓€灞€鍩熺綉涓嬶紝鍙互鍦� HoloLens2 鐨勮缃腑鐪嬪埌鍏� IP锛岀洿鎺ュ湪鐢佃剳涓婅闂�
       * 璋冭瘯闇€瑕佸湪 HoloLens2 涓婁笅杞� Holographic Remoting Player 杞欢骞舵墦寮€锛屽啀鍦� Unity 涓� 鈥橶indow鈥�-鈥榅R鈥�-鈥楬olographic Emulation鈥� 涓緭鍏ュ叾 IP 骞跺皾璇曡繛鎺�
       * 灏濊瘯澶氭鍚庝緷鏃ц繛鎺ヤ笉涓�......
+        * 10.29锛氭洿鏂颁簡 HoloLens2 鐨勫浐浠剁増鏈悗锛屾垚鍔熻繛鎺ヤ笂
       * 鏍规嵁瀹樻柟鏂囨。锛岄渶瑕佷笅杞藉苟瀵煎叆 MRTK.Tutorials.PCHolograhicRemoting 鍖咃紝灏� HolographicRemoting 棰勫埗浣撴嫋鍏ュ満鏅腑锛屽啀浣跨敤 unity build 鍚庡湪 VS 涓繍琛�
       * VS 缂栬瘧鏈€氳繃锛屾殏鏃舵湭鎴愬姛
 
diff --git a/doc/11.10/11.10.md b/doc/11.10/11.10.md
new file mode 100644
index 00000000..3a8f3340
--- /dev/null
+++ b/doc/11.10/11.10.md
@@ -0,0 +1,10 @@
+# 11.10
+
+* 鏁寸悊涔嬪墠娴嬭瘯鐢ㄧ殑浠g爜锛屽皢鍩烘湰鍑芥暟鍓ョ鍒板悇鑷殑鑴氭湰涓�
+* 瑙� Functions -> Spline / Ellipse / Hyperbola / Exponential / Logarithmic / Trigonometric / InverseTri
+* 澧炲姞浜嗚嚜瀹氫箟鍑芥暟缁樺埗鐨勬敮鎸侊紝缁撳悎涔嬪墠鍋氱殑 Calculator 杩涜 Mesh 缁樺埗骞朵笖閫氳繃娴嬭瘯
+* 澧炲姞浜嗕笁缁磋嚜瀹氫箟鍑芥暟缁樺埗鐨勬敮鎸�
+  * 鐩墠鍙敮鎸佸浐瀹� X-Y 鑼冨洿鍐呯殑缁樺埗锛屾棤娉曡嚜瀹氫箟澶嶆潅鍖洪棿
+* 澧炲姞浜嗗嚱鏁版柇鐐圭殑鍒ゆ柇锛屼粠鑰屾敮鎸佺粯鍒朵笉瀹屽叏杩炵画鐨勫嚱鏁�
+  * 浣嗘槸鍦ㄤ笁缁村嚱鏁版儏鍐典腑锛屾儏鍐垫洿涓哄鏉傦紝鍥犺€岃繕鏈仛鐩稿簲鐨勫鐞�
+  * 鑰屼笖鍙傝€冧腑瀛︽暟瀛︼紝涓夌淮鍑芥暟浼间箮鍙細鐢ㄥ湪骞抽潰涔嬩笂锛屼笉浼氬嚭鐜板鏉傛儏鍐�
diff --git a/doc/11.3/11.3.md b/doc/11.3/11.3.md
new file mode 100644
index 00000000..0f95cb9f
--- /dev/null
+++ b/doc/11.3/11.3.md
@@ -0,0 +1,14 @@
+# 11.3
+
+## 10.29
+
+* 涓� Microsoft 鏀寔杩涜鑱旂郴锛屾洿鏂颁簡 HoloLens2 鐨勫浐浠剁増鏈紝瑙e喅浜嗘湁鏃舵棤娉曞紑鏈轰互鍙婅繛鎺ヤ笉涓� Unity 鐨勯棶棰�
+* 鍦� HoloLens2 涓婂皾璇曚簡 MRTK 涓殑瀹炰緥鍦烘櫙锛�
+  * 瀵逛簬鐗╀綋鐨勬嫋鎷界缉鏀撅紝缁忓父浼氬嚭鐜扮敱浜庢墜杩愬姩骞呭害澶ぇ瀵艰嚧绂诲紑璇嗗埆鑼冨洿锛屽洜鑰屽湪璁捐鏃跺簲璇ュ敖閲忛伩鍏嶅ぇ骞呭害鐨勬嫋鎷芥搷浣滐紝淇濇寔鐗╀綋鍦ㄧ敾闈腑蹇冭緝濂�
+  * HoloLens2 瀵圭偣鍑绘垨鏄彙鎷抽€変腑鐨勫垽瀹氱暐鏈夌‖鏍革紝闅句互杩涜绮剧‘閫夋嫨锛屽洜鑰岀墿浣撲氦浜掔殑鍒ゅ畾鑼冨洿涓嶈兘澶皬锛屽挨鍏舵槸閫夌偣涔嬬被鐨勬搷浣�
+  * 鐩告瘮涔嬩笅锛屽浜庤闊宠瘑鍒殑绮惧害灏辫緝楂橈紝鍙互鑰冭檻澶氬姞浣跨敤
+
+## 10.30
+
+* 鍙傝€冧箣鍓嶅闀垮仛鐨� mathx 鐨� Hololens 鐗堟湰锛堜絾鏄涪澶变簡寰堝绱犳潗鎵€浠ヤ笉鑳借繍琛岋紝鍙兘鐪嬬湅鑴氭湰锛�
+* 娌跨敤鍏朵腑鐨� calculator 鐨勬兂娉曪紝浣垮紩鎿庢敮鎸佽嚜瀹氫箟鍑芥暟鐨勭粯鍒讹紝鍚屾椂渚濇棫淇濈暀鍩虹鍑芥暟鐨勭粯鍒跺姛鑳斤紙鑰冭檻鍒颁箣鍚庤繕闇€瑕佸畾鍒跺寲渚嬪瀵圭О杞达紝鐒︾偣绛夌壒娈婁俊鎭殑缁樺埗锛�
-- 
GitLab