SlideShare a Scribd company logo
Unityで幾何を
やる話
KMC-ID:ten
自己紹介
⚫ ID:ten
⚫ 京大情報学科3回計算機
⚫ Twitter:@ten986,@ten986_2600
⚫ ゲーム制作をしているつもり
⚫ 競プロやったことないです
近況
近況
近況2
⚫ これは財布の中身です
近況3
Unityで幾何を
やる話
KMC-ID:ten
幾何
⚫ 図形的なことをします
○ 点と線分の距離
○ 点と多角形の内外判定
○ 多角形の面積
おにぎりのわぎり
⚫ 「Unity1週間ゲームジャム」参加作品
⚫ おにぎりを円形に切る
⚫ 直線によって切る
⚫ 円に近い/面積が大きいほど高得点
⚫ https://unityroom.com/games/round_slice
今日話すこと
⚫ おにぎりのわぎりの実装の説明
⚫ Unityで幾何をするための知見
前準備
⚫ Unityで幾何をやるための前準備
⚫ PolygonCollider2Dを
判定する多角形として用いる
前準備
⚫ PolygonCollider2DのパスをVector2[]に変換しておく
⚫ GetPathという関数があります
前準備
⚫ PolygonCollider2Dのパスの座標は
「transformを適用する前の座標」
⚫ ワールド座標を取得したいなあ
⚫ さっき取得した座標にtransformを適用する
⚫ TransformPointという関数があります
おにぎりのわぎりの実装
1. おにぎりを切る
2.面積を測る(面積が大きいほど高得点)
3.円っぽさを測る(円に近いほど高得点)
おにぎりを切る
⚫ unity-sprite-cutterを使った
○ 凸多角形を直線で切れる
○ 若干改造して
単純な多角形に拡張&バグ取り
⚫ http://baba-s.hatenablog.com/entry/2017/12/31/163100
おにぎりを切る
⚫ 中のコードを見た
⚫ 幾何なんだけど、それ以上に
Unityの闇の部分に触れてる
⚫ ので、説明は割愛
⚫ ちなみにAsset Storeに
もっといいやつがあるっぽい
面積を測る
⚫ さっき取得した多角形の座標を元に面積を測る
⚫ このサイトを参考にした
⚫ https://imagingsolution.net/math/calc_n_point_area/
面積を測る
⚫ さっきのサイトによると
右のようになるらしい
⚫ 座標は取得できるので、
あとは実装するだけ!
面積を測る
⚫ 実装(数式をそのまま写したくらい)
⚫ 引数はパスとtransform
円っぽさを測る
⚫ (これは結構難しかった)
⚫ 円っぽさってなんやねん
⚫ まず定義します
円っぽさを測る
⚫ 多角形内部の任意の点において
⚫ 外周のうち最も近い点との距離
⚫ 外周のうち最も遠い点との距離
⚫ この2つの距離の比の最大値
⚫ 真円度っていう概念があるらしい
○ その定義に基づいてるので妥当っぽい?
円っぽさを測る
⚫ これを実装するには?
⚫ 点と多角形の内外判定
⚫ 点と線分の最も近い距離(っていうか距離)
⚫ 点と線分の最も遠い距離
点と多角形の内外判定
⚫ 以下のQiitaを参考にした
⚫ https://qiita.com/ykob/items/6118b8e2e7ddcd8b6355
⚫ 点と多角形の各点とのなす角の合計が360°になる
場合、その点が多角形に内包されている、ということ
になるらしい。
点と多角形の内外判定
⚫ 実装
⚫ ほぼ写した
点と線分の最も近い距離
⚫ 以下のQiitaを参考にした
⚫ https://qiita.com/yellow_73/items/bcd4e150e7caa0210
ee6
点と線分の最も近い距離
⚫ 記事によると、点と線分上の点との距離の2乗は
下に凸の2次関数になる
⚫ それのある範囲内の最小値を求めるのは高校数学~
○ 頂点が範囲内に含まれていれば頂点
○ そうでないなら範囲の端っこのどっちか
点と線分の最も近い距離
⚫ 実装
⚫ 写(ry
点と線分の最も遠い距離
⚫ 記事によると、点と線分上の点との距離の2乗は
下に凸の2次関数になる
⚫ ある範囲内の最大値は最小値より簡単
○ 範囲の端っこのどっちかが必ず最大値
点と線分の最も遠い距離
⚫ 実装
⚫ 2つの端点との距離のMaxを取ってる
円っぽさを測る
⚫ 道具は全部用意した!
⚫ ということでいよいよ円っぽさを測ります
⚫ 次のスライドの再掲する手順で実装します
円っぽさを測る(再掲)
⚫ 多角形内部の任意の点において
⚫ 外周のうち最も近い点との距離
⚫ 外周のうち最も遠い点との距離
⚫ この2つの距離の比の最大値
⚫ 真円度っていう概念があるらしい
○ その定義に基づいてるので妥当っぽい?
何はともあれ
⚫ まずはパスをワールド座標に変換しておきましょう
多角形内部任意の点をとる
⚫ 多角形内部の任意の点とは?
⚫ 任意の点を取ることは不可能
⚫ 多角形内にある程度細かく点をとりましょう
多角形内部任意の点をとる
⚫ 多角形の上下左右端をとる
⚫ その内部に細かく点をとろう
多角形内部任意の点をとる
⚫ 縦横それぞれn=30(+1)分割します
⚫ 961個の等間隔な点それぞれについて内部か判定
⚫ 内部なら以降の
判定をする
そういえば
⚫ 2つの距離の値から比を求める関数を用意しておく
⚫ 実装は、まぁはい。
⚫ 評価関数を変えたくなったときに便利なのでね
内部の点それぞれを見る
⚫ 内部の点それぞれについて、
○ 外周のすべての線分との距離の最小値を求める
○ 外周のすべての線分との距離の最大値を求める
○ 距離の最小値÷距離の最大値(つまり比)を求める
○ その値が今までで最大なら記録
内部の点それぞれを見る
⚫ 最大値を取るために初期化
⚫ 適当な点を取って、最大値を-∞にしとく
○ いつもの
点と線分との距離の最小値
⚫ パス内の線分を順にみていく
⚫ 距離が最小なら記録
点と線分との距離の最大値
⚫ パス内の線分を順にみていく
⚫ 距離が最大なら記録
距離と距離の比を計算
⚫ 距離の最小値÷距離の最大値(図ではValue)を求める
⚫ その値が最大なら記録
⚫ すべての点で見たら、
maxValueを返す
円っぽさを測る
⚫ 以上の手順で求めたmaxValueが求めたい円っぽさ
⚫ お疲れ様でした!!!
⚫ スライドの半分、円っぽさの計測じゃねえか
まとめ
⚫ Unityで幾何がやれます
○ このスライドの前準備をするといい感じになる
○ 図形っぽい話だけど他に無さそうな機能だったら
自分で実装できる!すごい!
⚫ ある図形的操作は調べれば割と出るので、
自分のやりたい手順を分割してそれぞれ調べて実装、
っていう感じになるかなあ

More Related Content

What's hot

Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
torisoup
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
Yusuke Matsushita
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 
広告がうざい
広告がうざい広告がうざい
広告がうざいGen Ito
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
torisoup
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
UnityTechnologiesJapan002
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
torisoup
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
Unity Technologies Japan K.K.
 

What's hot (20)

Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
広告がうざい
広告がうざい広告がうざい
広告がうざい
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
 

More from 京大 マイコンクラブ

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
京大 マイコンクラブ
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
京大 マイコンクラブ
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
京大 マイコンクラブ
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
京大 マイコンクラブ
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
京大 マイコンクラブ
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
京大 マイコンクラブ
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
 
Altseed
AltseedAltseed
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
京大 マイコンクラブ
 
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
京大 マイコンクラブ
 

More from 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 
C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回C#でゲームを作る2016 第7回
C#でゲームを作る2016 第7回
 

Geometry with Unity