学校のジオメトリとUnity3D

前回の記事では、オンラインプランナーおよびアパートデザイナーであるPlanoplanについて説明しました 。 調査にわずかな差をつけて、PlanoplanとUnity3Dの学校ジオメトリのトピックが受賞しました。



簡単に経験を要約すると、かなり単純なアルゴリズムを適切に使用すると、製品が大幅に改善されることがわかります。 この記事では、単純なアルゴリズムが使用されているため、数式やコードを使用しないことにしました。 それらのいくつかがまだ必要な場合-コメントに書いてください。







壁、幅木、その他の表面の正しい交点



壁の交差点を見つけるのは非常に簡単です。 各壁には、大まかに言えば、外部と内部の2本の線があります。 2つの方程式のシステムを解くことにより、平面上の線の各ペアの交点を見つけることができます(線が平行であるか、線間の角度が小さい場合の境界の場合を除く)。 グレード7の代数コース。







左側には、壁の交差点があります。 右側は、壁の交点が許容できない場所にある境界ケースです。 壁の位置または厚さが変化すると、Unity3Dで壁の交点が動的に決定されます。



湾曲した壁と開口部



まっすぐな壁の正しい交差点を計算した後のリアリズムへの次のステップは、湾曲した壁の構築と交差点です。



曲線壁は、 二次ベジェ曲線を使用して構築されます 。 アルゴリズムは単純です。2つのポイント(壁の始点と終点)がある場合、手動で3番目のポイントを選択します。 これらの3つのポイントから、アルゴリズムは曲線上の任意のポイントを見つけることができます。 曲線壁は多くのブロックで構成され、各ブロックの中心はこの曲線上にあります。 壁のリニアメーターあたり約10ブロックがあります-数値は経験的に選択されます。







壁の端は、他の壁との正しいジョイントを確保するために少し異なって三角形にされています。







かなり単純なメッシュであることが判明しましたが、パフォーマンスに大きな影響はありません。



このような壁の複雑さは、窓、ドア、開口部の作り方をまだ理解していないことです。 プログラムで窓やドアを曲げることは可能ですが、これは実際には起こりません。 しかし、バルコニー、さまざまな棚(多くの場合、現代の住宅)の建設には、湾曲した壁が最適です。



ブール演算(以下を参照)を使用すると、この問題を解決できます。 湾曲した壁の開口部、窓、ドアについて、実際の生活から他のアイデアやストーリーがある場合は、コメントを歓迎します。



湾曲した壁の交点は少し複雑に計算されます-そして、Delaunayの三角形分割とメッシュ生成に対処する必要があります。



ドローネの三角形分割とカーリーオープニング



3Dグラフィックスは、三角形を使用して実世界のオブジェクトの近似を処理することが広く知られています。 さらに、任意のサーフェスを無限の方法で三角形で近似できることは直感的に明らかです。 多数の頂点を持つポリゴンでも、非常に多くの方法で三角形に分割できます。



最も有名な方法の1つ(9年生の幾何学コース)はDelaunayの三角形分割 (フランス人にちなんで名付けられず、ロシアの数学者Boris Nikolaevich Deloneの名前による)です。



三角形分割を使用する前に、メッシュは長方形のパーツから生成されました。 ウィンドウを開く例を使用して、ウィンドウの前、ウィンドウの上下、ウィンドウの後に長方形が生成されました。 これにより、ウィンドウ自体の形状に特定の制限が課されます。このような方法では、ウィンドウは正方形にしかできません。



だった





になっています





長方形の窓の場合、効果は明ら​​かではありませんが、ドロネー三角形分割により、壁の穴のさまざまな形状、サイズ、位置を使用できました。



制限付きの三角形分割を使用します。 この場合、表面は2種類の輪郭で定義されます。外部-外部境界の定義、および内部-制約(または、より単純に、穴)の定義です。 いくつかの内部輪郭があります。







手続き型メッシュ生成



好奇心reader盛な読者がこのセクションを理解することができたため、準備された家具を除いて、プロジェクトのすべての要素がその場でPlanoplanで生成されます。



2Dモードの直線壁は、6点(壁の中線の両端と四角形の4つの頂点)で生成され、幅、長さ、高さを持ちます。







(上で説明したように)2Dモードの曲線壁は、2次ベジェ曲線上にある幅、長さ、および高さを持つ点の配列によって生成されます。







3Dモードの壁は、2D壁データと壁の高さに基づいて生成されます。







窓やドア用の開口部が壁に生成され、穴の輪郭に沿って生成された傾斜によって縫い付けられます。 それらはほとんどどんな形でも構いません。







床と天井は、指定された部屋を記述するポイントに自動的に作成されます(部屋の検索については以下を参照)。 Delaunay三角形分割が使用されます。







輪郭要素(幅木など)を生成するために、セクションとパスの2つの輪郭が使用されます。











メッシュ切断(ブール演算)



今日の学校のジオメトリからのジェダイの仕事は、ブール演算を導入して、3次元空間でのサーフェスの交差を計算することです(たとえば、湾曲した壁のカーブゾーニング)。 現時点では、ブール演算は、このような壁が切り取られたアパートのレンダリングを作成するためにのみ使用されます。





理論上は次のようになります。





そして、これが実際の現在の開発です。







将来的には、ブール演算の広範な導入が計画されています。これにより、窓、ドアを完全に配置できます(たとえば、窓の上に窓を配置したり、窓を窓の上に配置したり、窓を壁の端に移動したり、窓を壁の接合部に配置したりするなど)。 。 また、階段や吹き抜けを実装するために床と天井に穴を開けたり、単に穴を開けることでシンクなどの要素をあらゆるカウンタートップに統合したりすることもできます。



将来的には、窓やドアの配置を3Dモードで直接実装する予定です。



部屋検索



手始めに、簡単なアルゴリズムから、Planoplanは部屋の自動検索を実装します。これにより、ユーザーが手動で部屋を設定する作業を削除できます。 たとえば、ユーザーが壁から閉ループを作成すると、Planoplanで床と天井が自動的に作成されます。 これにより、ユーザーは部屋のベーススクエアを変更するのではなく、「壁ごと」にアパートを構築できます。



検索は、右バイパス法を使用したポイント(壁)間の接続に基づいて、再帰的に実装されます。



写真付きの8つのステップ
1.壁とポイントを構築します。





2.壁の1つで閉ループの検索を開始します。





3.ポイント間の接続に基づいて、選択した壁の2番目のポイントの右端(隅)の壁に移動します。





4.次に、最初の壁にぶつかるまで進みます。





5.ルームを作成します。





6.次の部屋の検索に進みます。 どうやら、デッドロックの壁でキャッチがあります。 連続性のない壁を見つけ、行き止まりとしてマークします。 私たちは一歩戻って行き止まりを除いて次の正しい壁を探します。





別のステップバック。





7.先に進む...





...再び回路を閉じるまで。





8.これで検索が完了しました。 すべての輪郭が見つかりました。



いくつかのニュアンスに言及する価値があります。

  • 壁を越えて、行き止まりのものと、すでに2つの閉じたループで構成されているものを、さらに検索から除外します。
  • 検索中に、すべての部屋を含む外部輪郭が見つかります。 また、除外されます。


もっと知りたい!



アントンジャガヒーカルプンツォワに代表される私たちのリーダーシップとユニティファイターは、12月1日14時30分(モスクワ、ホリデイインソコルニキ、チスティープルーディホール)のCGイベントでプラノプランについて話します。 見に来て、質問して、開発者とチャットして、Oculus Riftを手に取りましょう。



CGイベントでのプレゼンテーションに基づいて、シリーズの次の記事では、ユーザー画像のサーバーレンダリングがPlanoplanでどのように配置されるかについて説明します。



All Articles