diff --git a/Assets/Resources/Prefabs/Facts/Triangle.prefab b/Assets/Resources/Prefabs/Facts/Triangle.prefab
index dd00b4c22742f2165838556f9e75e90fc290e656..2d93daeb9968f779704de72305b4d37d76b5320f 100644
--- a/Assets/Resources/Prefabs/Facts/Triangle.prefab
+++ b/Assets/Resources/Prefabs/Facts/Triangle.prefab
@@ -675,6 +675,6 @@ MonoBehaviour:
   - {fileID: 6626359674163989219}
   NormalOffset: []
   AlternateNormals: 0
-  ab: 1
-  height: 1
+  _ab: 1
+  _height: 1
   _c: 0.5
diff --git a/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab b/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..8c1f2e654f12ca8822eb973a08033fe240c1c5f7
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab
@@ -0,0 +1,596 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2688299870578515406
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 29302832430599646}
+  - component: {fileID: 503893222331825355}
+  - component: {fileID: 661528896933927744}
+  - component: {fileID: 3021905677247651873}
+  m_Layer: 22
+  m_Name: LabelText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &29302832430599646
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2688299870578515406}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -0.25}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 3390467403729316765}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0.5, y: 0.5}
+  m_SizeDelta: {x: 2, y: 0.5}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &503893222331825355
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2688299870578515406}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  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: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, 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_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &661528896933927744
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2688299870578515406}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Test
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 4
+  m_fontSizeBase: 4
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 503893222331825355}
+  m_maskType: 0
+--- !u!114 &3021905677247651873
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2688299870578515406}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8cf5a358dacd3b54ab093ee289dd9ba2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Cam1: {fileID: 0}
+  Cam2: {fileID: 0}
+  BackUPCam: {fileID: 0}
+--- !u!1 &3319392661904935552
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7541265271928914416}
+  - component: {fileID: 1312883106029576503}
+  - component: {fileID: 5284903402926663935}
+  - component: {fileID: 2574848627300415222}
+  - component: {fileID: 7280041197286401157}
+  m_Layer: 22
+  m_Name: Mesh Outer
+  m_TagString: SnapZone
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7541265271928914416
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3319392661904935552}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: -0.02, z: 0.02}
+  m_LocalScale: {x: 1.04, y: 1.04, z: 1.04}
+  m_ConstrainProportionsScale: 1
+  m_Children: []
+  m_Father: {fileID: 3390467403729316765}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1312883106029576503
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3319392661904935552}
+  m_Mesh: {fileID: 0}
+--- !u!23 &5284903402926663935
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3319392661904935552}
+  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: 8ae9adf4dc782964387385c1e8c0eb72, 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_AdditionalVertexStreams: {fileID: 0}
+--- !u!64 &2574848627300415222
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3319392661904935552}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 1
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 0}
+--- !u!114 &7280041197286401157
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3319392661904935552}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _URI: 
+  FactText: []
+  StringLabelFormats: []
+  Default: {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  Selected: {fileID: 2100000, guid: 34a95baef388bb8458c97a626b732f9f, type: 2}
+  Hint: {fileID: 2100000, guid: 8621b710d7d1d5041bc6bfd0cc37cdff, type: 2}
+  Solution: {fileID: 2100000, guid: 2a003f0807acc1142965bb21bdc824f6, type: 2}
+  renderer:
+  - {fileID: 5284903402926663935}
+  - {fileID: 1078883255209641429}
+--- !u!1 &5866155945383417828
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8554957501859850914}
+  - component: {fileID: 3164742056485930267}
+  - component: {fileID: 1460740696286669547}
+  m_Layer: 22
+  m_Name: Prism Highlight
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8554957501859850914
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: -0.01, z: 0.01}
+  m_LocalScale: {x: 1.02, y: 1.02, z: 1.02}
+  m_ConstrainProportionsScale: 1
+  m_Children: []
+  m_Father: {fileID: 142224692930156368}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3164742056485930267
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_Mesh: {fileID: 0}
+--- !u!23 &1460740696286669547
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  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: 8ae9adf4dc782964387385c1e8c0eb72, 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!1 &6262947649539239553
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 142224692930156368}
+  - component: {fileID: 7167210412035754299}
+  - component: {fileID: 1078883255209641429}
+  - component: {fileID: 8526453253978894086}
+  - component: {fileID: -7239156242830623982}
+  m_Layer: 22
+  m_Name: Mesh Inner
+  m_TagString: SnapZone
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &142224692930156368
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  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:
+  - {fileID: 8554957501859850914}
+  m_Father: {fileID: 3390467403729316765}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &7167210412035754299
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Mesh: {fileID: 0}
+--- !u!23 &1078883255209641429
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  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: 8ae9adf4dc782964387385c1e8c0eb72, 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_AdditionalVertexStreams: {fileID: 0}
+--- !u!64 &8526453253978894086
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 1
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 0}
+--- !u!114 &-7239156242830623982
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _URI: 
+  FactText: []
+  StringLabelFormats: []
+  Default: {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  Selected: {fileID: 2100000, guid: 34a95baef388bb8458c97a626b732f9f, type: 2}
+  Hint: {fileID: 2100000, guid: 8621b710d7d1d5041bc6bfd0cc37cdff, type: 2}
+  Solution: {fileID: 2100000, guid: 2a003f0807acc1142965bb21bdc824f6, type: 2}
+  renderer:
+  - {fileID: 1078883255209641429}
+  - {fileID: 5284903402926663935}
+--- !u!1 &6839596689016440457
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3390467403729316765}
+  - component: {fileID: 6950663371922587874}
+  - component: {fileID: 4168309156902745950}
+  m_Layer: 22
+  m_Name: TriangularPrism
+  m_TagString: Selectable
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3390467403729316765
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6839596689016440457}
+  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:
+  - {fileID: 7541265271928914416}
+  - {fileID: 142224692930156368}
+  - {fileID: 29302832430599646}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &6950663371922587874
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6839596689016440457}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _URI: 
+  FactText:
+  - {fileID: 0}
+  StringLabelFormats: []
+  Default: {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  Selected: {fileID: 2100000, guid: 34a95baef388bb8458c97a626b732f9f, type: 2}
+  Hint: {fileID: 2100000, guid: 8621b710d7d1d5041bc6bfd0cc37cdff, type: 2}
+  Solution: {fileID: 2100000, guid: 2a003f0807acc1142965bb21bdc824f6, type: 2}
+  renderer:
+  - {fileID: 1078883255209641429}
+--- !u!114 &4168309156902745950
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6839596689016440457}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 278725439dae7c14d95900d3c5f539b1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Meshs:
+  - {fileID: 1312883106029576503}
+  - {fileID: 7167210412035754299}
+  - {fileID: 3164742056485930267}
+  NormalOffset: []
+  AlternateNormals: 0
+  _triangle_ab: 1
+  _triangle_height: 1
+  _triangle_c: 0.5
+  _prism_height: 1
diff --git a/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab.meta b/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0e3ae85365745ab78878a08268267d6261915bf8
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/TriangularPrism.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4295c5be42e7ff649b031d8dfaaf9d04
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scenes/Worlds/RiverWorld.unity b/Assets/Scenes/Worlds/RiverWorld.unity
index ca124906c2f031a546cf5a9a4b208c5ba7b6ddc1..c14c4fac1562ca0ea5604858666212c52e34ac21 100644
--- a/Assets/Scenes/Worlds/RiverWorld.unity
+++ b/Assets/Scenes/Worlds/RiverWorld.unity
@@ -38,7 +38,7 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
-  m_IndirectSpecularColor: {r: 0.44084534, g: 0.48955458, b: 0.56959116, a: 1}
+  m_IndirectSpecularColor: {r: 0.44100717, g: 0.4898312, b: 0.5698877, a: 1}
   m_UseRadianceAmbientProbe: 0
 --- !u!157 &3
 LightmapSettings:
@@ -60580,7 +60580,7 @@ PrefabInstance:
     - target: {fileID: 2258042202925325658, guid: b07552db700124a4680401e6fb94c186,
         type: 3}
       propertyPath: factLayerMask.m_Bits
-      value: 2161664
+      value: 6355968
       objectReference: {fileID: 0}
     - target: {fileID: 2267088185126138740, guid: b07552db700124a4680401e6fb94c186,
         type: 3}
@@ -60830,6 +60830,12 @@ PrefabInstance:
       value: 
       objectReference: {fileID: 6839596689016440457, guid: ba4e0d31779023d4d8a5767fd6dccf5c,
         type: 3}
+    - target: {fileID: 2872381745209199267, guid: b07552db700124a4680401e6fb94c186,
+        type: 3}
+      propertyPath: TriangularPrism
+      value: 
+      objectReference: {fileID: 6839596689016440457, guid: 4295c5be42e7ff649b031d8dfaaf9d04,
+        type: 3}
     - target: {fileID: 2885104145836066559, guid: b07552db700124a4680401e6fb94c186,
         type: 3}
       propertyPath: m_AnchorMax.y
@@ -62123,7 +62129,7 @@ PrefabInstance:
     - target: {fileID: 4705772093382662422, guid: b07552db700124a4680401e6fb94c186,
         type: 3}
       propertyPath: factLayerMask.m_Bits
-      value: 2161664
+      value: 6355968
       objectReference: {fileID: 0}
     - target: {fileID: 4781424044739630211, guid: b07552db700124a4680401e6fb94c186,
         type: 3}
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
index 70584ecf68cabbe8be31c7a1a6939f291d1a41cc..59e469d4b1b00af11e6b785fdf35ab278b33296d 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
@@ -24,7 +24,8 @@ public GameObject
         Triangle,
         Sphere,
         ActualSphere,
-        Cuboid
+        Cuboid,
+        TriangularPrism
         ;
 
     private void OnEnable()
@@ -76,6 +77,8 @@ public void SpawnFactRepresentation(Fact fact)
                 SpawnSphere(sphereFact); break;
             case CuboidFact cuboidFact:
                 SpawnCuboid(cuboidFact); break;
+            case PrismFact prismFact:
+                SpawnTriangularPrism(prismFact); break;
             default: break;
         };
     }
@@ -124,7 +127,6 @@ public void SpawnSimpleCircle(SimpleCircleFact fact){
 
     public void SpawnTriangle(TriangleFact2 fact)
     {
-
         GameObject triangle = GameObject.Instantiate(Triangle);
         fact.WorldRepresentation = triangle.GetComponent<FactObject3D>();
         fact.WorldRepresentation.Fact = fact;
@@ -142,6 +144,26 @@ public void SpawnTriangle(TriangleFact2 fact)
         }
     }
 
+    public void SpawnTriangularPrism(PrismFact fact)
+    {
+        GameObject prism = GameObject.Instantiate(TriangularPrism);
+        fact.WorldRepresentation = prism.GetComponent<FactObject3D>();
+        fact.WorldRepresentation.Fact = fact;
+
+        prism.transform.SetPositionAndRotation(fact.Position, fact.Rotation);
+        // triangle.transform.localScale = Vector3.Scale(triangle.transform.localScale, fact.LocalScale);
+        prism.GetComponentInChildren<TextMeshPro>().text = fact.GetLabel(StageStatic.stage.factState) + " = " + System.Math.Round(fact.Volume, 2) + "m³";
+
+        TriangluarPrismGenerator[] triangelGenerators = prism.GetComponentsInChildren<TriangluarPrismGenerator>();
+        foreach (var gen in triangelGenerators)
+        {
+            gen.triangle_ab = Vector3.Distance(fact.A, fact.B);
+            gen.triangle_height = Vector3.Distance(fact.c, fact.C);
+            gen.triangle_c = fact.cPosition;
+            gen.prism_height = Vector3.Distance(fact.A, fact.D);
+        }
+    }
+
     public void SpawnPoint(PointFact fact)
     {
         GameObject point = GameObject.Instantiate(Sphere);
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
index 648ee0c0e72b5ce4af7477736edf9cb80c521eee..c818c51f29bc6377defd62c7fc5d39af5cac02d1 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
@@ -91,6 +91,10 @@ public static class ParsingDictionary
             MMTConstants.CuboidType,
             CuboidFact.parseFact
         },
+        {
+            MMTConstants.PrismType,
+            PrismFact.parseFact
+        },
     };
 
     // TODO: get rid of this
@@ -136,6 +140,7 @@ public static class ParsingDictionary
 [JsonSubtypes.KnownSubType(typeof(SimpleCircleFact), nameof(SimpleCircleFact))]
 [JsonSubtypes.KnownSubType(typeof(SphereFact), nameof(SphereFact))]
 [JsonSubtypes.KnownSubType(typeof(CuboidFact), nameof(CuboidFact))]
+[JsonSubtypes.KnownSubType(typeof(PrismFact), nameof(PrismFact))]
 public abstract class Fact
 {
     [JsonIgnore]
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs
new file mode 100644
index 0000000000000000000000000000000000000000..13be44c518b7f5597f66ed6160260943445a0124
--- /dev/null
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs
@@ -0,0 +1,140 @@
+using Newtonsoft.Json;
+using REST_JSON_API;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UIElements;
+
+/// <summary>
+/// Point in 3D Space
+/// </summary>
+public class PrismFact : FactWrappedCRTP<PrismFact>
+{
+
+
+    //used points
+    public string PidT, PidD;
+
+    public Vector3 A, B, C, a, b, c, D;
+
+    public float cPosition;
+
+    public float Volume = 0.0F;
+
+
+
+    public TriangleFact2 GetT {get =>  (TriangleFact2)FactRecorder.AllFacts[PidT];}
+    public PointFact GetD {get =>  (PointFact)FactRecorder.AllFacts[PidD];}
+    protected void calculate_vectors(){
+
+        A = ((TriangleFact2)FactRecorder.AllFacts[PidT]).A + Vector3.zero;
+        B = ((TriangleFact2)FactRecorder.AllFacts[PidT]).B + Vector3.zero;
+        C = ((TriangleFact2)FactRecorder.AllFacts[PidT]).C + Vector3.zero;
+        a = ((TriangleFact2)FactRecorder.AllFacts[PidT]).a + Vector3.zero;
+        b = ((TriangleFact2)FactRecorder.AllFacts[PidT]).b + Vector3.zero;
+        c = ((TriangleFact2)FactRecorder.AllFacts[PidT]).c + Vector3.zero;
+        D = ((PointFact)FactRecorder.AllFacts[PidD]).Point + Vector3.zero;
+
+        cPosition = Vector3.Distance(A, c) / Vector3.Distance(A, B);
+
+        Volume = ((TriangleFact2)FactRecorder.AllFacts[PidT]).Area * Vector3.Distance(A, D);
+
+        Position = ((TriangleFact2)FactRecorder.AllFacts[PidT]).Position;
+
+        Rotation = ((TriangleFact2)FactRecorder.AllFacts[PidT]).Rotation;
+    }
+
+    public PrismFact() : base(){
+        this.PidT = null;
+        this.PidD = null;
+    }
+    [JsonConstructor]
+    public PrismFact( string PidT, string PidD) : base()
+    {
+        this.PidT = PidT;
+        this.PidD = PidD;
+
+        calculate_vectors();
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// <see cref="Normal"/> set to <c>Vector3.up</c>
+    /// </summary>
+    /// <param name="Point">sets <see cref="Point"/></param>
+    /// <param name="ServerDefinition">MMT URI as OMS</param>
+    public PrismFact(string PidT, string PidD, SOMDoc ServerDefinition) : base()
+    {
+        this.PidT = PidT;
+        this.PidD = PidD;
+        
+        this.ServerDefinition = ServerDefinition;
+
+        calculate_vectors();
+    }
+
+    /// \copydoc Fact.parseFact(ScrollFact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
+    {
+        if (((MMTGeneralFact)fact).defines is not OMA df)
+            yield break;
+
+        OMS triangleT, pointD;
+
+        triangleT = (OMS)df.arguments[0];
+        pointD = (OMS)df.arguments[1];
+
+        string PidT = triangleT.uri;
+        string PidD = pointD.uri;
+
+        
+
+        ret.Add(new PrismFact(PidT, PidD));
+
+        //ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
+        //ret.Add(new PointFact(SOMDoc.MakeVector3(defines), fact.@ref));
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override bool HasDependentFacts => true;
+
+    /// \copydoc Fact.getDependentFactIds
+    protected override string[] GetDependentFactIds()
+        => new string[] { PidT, PidD};
+
+    /// \copydoc Fact.GetHashCode
+    /* public override int GetHashCode()
+        => this.Point.GetHashCode();
+    */
+    protected override void RecalculateTransform()
+    {
+        calculate_vectors();
+    }
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(PrismFact p1, PrismFact p2){
+        return DependentFactsEquivalent(p1, p1);
+    }
+
+    protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new){
+        return new PrismFact(this.PidT, this.PidD);
+    }
+
+    public override MMTFact MakeMMTDeclaration()
+    {
+        SOMDoc tp = new OMS(MMTConstants.PrismType);
+
+        return new MMTGeneralFact(_LastLabel, tp, Defines());
+    }
+
+    public override SOMDoc Defines()
+        => new OMA(
+                new OMS(MMTConstants.PrismCons),
+                new[] {
+                    new OMS(PidT),
+                    new OMS(PidD),
+                }
+            );
+}
\ No newline at end of file
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs.meta b/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..242380fdb413ee6ea6295fa5dbcb54bd4bec84de
--- /dev/null
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/PrismFact.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1bc5eca8409b78c408eacca28e4a0ad7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/TriangleFact2.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/TriangleFact2.cs
index 6b77cac4da5b7c60c741f9dbb16ccaeda7342b69..8676234babc1712eabb8655536855a32edd175f7 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/TriangleFact2.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/TriangleFact2.cs
@@ -40,9 +40,9 @@ protected void calculate_vectors(){
 
         Area = 0.5f * (Vector3.Distance(A, B) * Vector3.Distance(c, C));
 
-        Vector3 scale = new Vector3(Vector3.Distance(A, B), Vector3.Distance(c, C), 1.0F);
+        // Vector3 scale = new Vector3(Vector3.Distance(A, B), Vector3.Distance(c, C), 1.0F);
         
-        LocalScale = scale;
+        // LocalScale = scale;
 
         /*
         Vector3 lineVec3 = B - A;
@@ -141,17 +141,8 @@ protected override void RecalculateTransform()
         calculate_vectors();
     }
     /// \copydoc Fact.Equivalent(Fact, Fact)
-    protected override bool EquivalentWrapped(TriangleFact2 f1, TriangleFact2 f2){
-        
-        return (
-
-                    Math3d.IsApproximatelyEqual(f1.A, f2.A)
-                && Math3d.IsApproximatelyEqual(f1.B, f2.B)
-                && Math3d.IsApproximatelyEqual(f1.C, f2.C)
-                && Math3d.IsApproximatelyEqual(f1.c, f2.c)
-
-        );
-
+    protected override bool EquivalentWrapped(TriangleFact2 t1, TriangleFact2 t2){
+        return DependentFactsEquivalent(t1, t2);
     }
 
     protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new){
@@ -171,9 +162,9 @@ public override SOMDoc Defines()
         => new OMA(
                 new OMS(MMTConstants.TriangleCons),
                 new[] {
-                        new OMS(PidA),
-                        new OMS(PidB),
-                        new OMS(PidC),
+                    new OMS(PidA),
+                    new OMS(PidB),
+                    new OMS(PidC),
                 }
             );
 }
\ No newline at end of file
diff --git a/Assets/Scripts/MMTServer/CommunicationProtocoll/MMTConstants.cs b/Assets/Scripts/MMTServer/CommunicationProtocoll/MMTConstants.cs
index db02890bbfa803434b73c5cce3e7a6a6dd514fe1..54d2d7d4cdfcacf1f56c05864388beea513852dd 100644
--- a/Assets/Scripts/MMTServer/CommunicationProtocoll/MMTConstants.cs
+++ b/Assets/Scripts/MMTServer/CommunicationProtocoll/MMTConstants.cs
@@ -48,6 +48,10 @@ public static class MMTConstants
         public static readonly string TriangleType = "http://mathhub.info/MitM/core/geometry?Geometry/Triangles?triangle";
         public static readonly string TriangleScroll = "http://mathhub.info/FrameIT/frameworld?TriangleScroll";
 
+        public static readonly string PrismCons = "http://mathhub.info/FrameIT/frameworld?prismType?prismCons";
+        public static readonly string PrismType = "http://mathhub.info/FrameIT/frameworld?RectangleType?prismType";
+        public static readonly string PrismScroll = "http://mathhub.info/FrameIT/frameworld?PrismScroll";
+
         public static readonly string CuboidCons = "http://mathhub.info/FrameIT/frameworld?CuboidType?cuboidCons";
         public static readonly string CuboidType = "http://mathhub.info/FrameIT/frameworld?CuboidType?cuboidType";
         public static readonly string CuboidScroll = "http://mathhub.info/FrameIT/frameworld?CuboidScroll";
@@ -275,6 +279,10 @@ public static class MMTConstants
                 CuboidType,
                 typeof(CuboidFact)
             },
+            {
+                PrismType,
+                typeof(PrismFact)
+            },
         };
         public static readonly IReadOnlyDictionary<Type, string> TYPE_TO_OMS = OMS_TO_TYPE.ReverseKeyValInto(new()
         { // **Overrides**
diff --git a/Assets/Scripts/MeshGenerator/TriangleGenerator.cs b/Assets/Scripts/MeshGenerator/TriangleGenerator.cs
index b8ed7c36fe45829b4936c8cc6550fe0065b22a2d..0bb1ca35d9c5b2fb80470d8742b6040270a333aa 100644
--- a/Assets/Scripts/MeshGenerator/TriangleGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/TriangleGenerator.cs
@@ -6,9 +6,27 @@ public class TriangleGenerator : ShapeGenerator
 {
     #region InspectorVariables
     [Header("Triangle values")]
-    public float ab = 1f;
-    public float height = 1f;
+    [SerializeField] protected float _ab = 1f;
+    [SerializeField] protected float _height = 1f;
     [SerializeField] protected float _c = 0.5f;
+    public float ab
+    {
+        get { return _ab; }
+        set
+        {
+            _ab = value;
+            GenerateShapeForAll();
+        }
+    }
+    public float height
+    {
+        get { return _height; }
+        set
+        {
+            _height = value;
+            GenerateShapeForAll();
+        }
+    }
     public float c
     {
         get { return _c; }
diff --git a/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs b/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0e2edd06734c484201b6ac834b457a0c2fd8a3a5
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Linq;
+using UnityEngine;
+
+public class TriangluarPrismGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Triangle values")]
+    [SerializeField] protected float _triangle_ab = 1f;
+    [SerializeField] protected float _triangle_height = 1f;
+    [SerializeField] protected float _triangle_c = 0.5f;
+    [SerializeField] protected float _prism_height = 1f;
+    public float triangle_ab
+    {
+        get { return _triangle_ab; }
+        set
+        {
+            _triangle_ab = value;
+            GenerateShapeForAll();
+        }
+    }
+    public float triangle_height
+    {
+        get { return _triangle_height; }
+        set
+        {
+            _triangle_height = value;
+            GenerateShapeForAll();
+        }
+    }
+    public float triangle_c
+    {
+        get { return _triangle_c; }
+        set
+        {
+            _triangle_c = value;
+            GenerateShapeForAll();
+        }
+    }
+    public float prism_height
+    {
+        get { return _prism_height; }
+        set
+        {
+            _prism_height = value;
+            GenerateShapeForAll();
+        }
+    }
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override (Vector3[] vertices, int[] triangles) GenerateTopology()
+        => CreateTriangluarPrism(triangle_ab, triangle_height, triangle_c, prism_height);
+
+    /// <summary>
+    /// Creates circle vertecies and triangles around the midPoint at (0,0,0)
+    /// </summary>
+    /// <param name="points"></param>
+    /// <param name="invert"></param>
+    /// <returns></returns>
+    public static (Vector3[], int[]) CreateTriangluarPrism(float triangle_ab, float triangle_height, float triangle_c, float prism_height, Vector3 offset, bool invert = false)
+    {
+        Vector3[] bottom_edge = GetTrianglePoints(triangle_ab, triangle_height, triangle_c);
+        Vector3[] bottom_vertices =
+            new Vector3[] { offset }
+            .AppendRange(bottom_edge)
+            .Append(bottom_edge[0])
+            .ToArray();
+        int[] bottom_boundary = Enumerable.Range(1, bottom_edge.Length).ToArray();
+
+        Vector3[] top_edge = GetTrianglePoints(triangle_ab, triangle_height, triangle_c, new Vector3(0, 0, -prism_height));
+        Vector3[] top_vertices =
+            new Vector3[] { offset }
+            .AppendRange(top_edge)
+            .Append(top_edge[0])
+            .ToArray();
+        int[] top_boundary = Enumerable.Range(1, top_edge.Length).ToArray();
+
+        return CreatePrism(
+                    CreatePlane(top_vertices),
+                    CreatePlane(bottom_vertices, true),
+                    top_boundary,
+                    bottom_boundary
+                );
+    }
+
+    public static (Vector3[], int[]) CreateTriangluarPrism(float triangle_ab, float triangle_height, float triangle_c, float prism_height, bool invert = false)
+        => CreateTriangluarPrism(triangle_ab, triangle_height, triangle_c, prism_height, Vector3.zero, invert);
+    #endregion Implementation
+}
diff --git a/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs.meta b/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..45764f5583bb3fe2fa38e97d9d509141f243bdf8
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TriangluarPrismGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 278725439dae7c14d95900d3c5f539b1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset
index f87645289604f36f758df27607805e5899bbdd62..1c170723af601831ca1abbec3fba9a69a3dd4f17 100644
--- a/ProjectSettings/TagManager.asset
+++ b/ProjectSettings/TagManager.asset
@@ -34,7 +34,7 @@ TagManager:
   - Tree
   - SnapZone
   - Triangle
-  - 
+  - TriangularPrism
   - 
   - 
   -