【Unity】螺旋状にオブジェクトを生成する

説明

前回のに続き、次は螺旋状にオブジェクトを生成します。 以前のコードから単に、Z軸を少しずつずらしているだけです。

奥行きの距離を表すために、Length設定値を復活させています。 また、位置決めの前に Z軸の 足し算を行っているので、 初期値は1回分足し込み分を引いています。

f:id:rhythmcan0:20180615000750j:plain

数が少ないと、わかりにくいのでオブジェクトを100個生成してみました。

f:id:rhythmcan0:20180615000753j:plain

コード

前回まで Creater って書いていた。。 Creatorでした・・・

using UnityEngine;

public class SpiralObjectCreator : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 100; // 生成するオブジェクトの数

    [SerializeField]
    private float radius = 5f; // 半径

    [SerializeField]
    private float repeat = 5f; // 何周期するか

    [SerializeField]
    private float length = 50f; // Z軸の長さ


    void Start () {

        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π
        var oneLength = length / itemCount; // Z軸の1単位
        var z = transform.position.z - oneLength; // Z軸初期位置 (生成前に足しこみをしているので、一回分引いておく)

        for (var i = 0; i < itemCount; ++i)
        {

            var point = ((float)i / itemCount) * oneCycle; // 周期の位置 (1.0 = 100% の時 2π となる)
            var repeatPoint = point * repeat; // 繰り返し位置

            var x = Mathf.Sin(repeatPoint) * radius;
            var y = Mathf.Cos(repeatPoint) * radius;
            z += oneLength;

            var position = new Vector3(x, y, z);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }
        
    }
    
}

GitHub

github.com

発展

次回は、球状にオブジェクトを配置します。

後、オブジェクトを粒子状に配置するのではなく、 線として連続してつなげて生成したい。 どうやったら良いんだろう?

【Unity】円状にオブジェクトを生成する

説明

前回サインカーブに引き続き、今回は円状にオブジェクトを生成します。

ちょっとリファクタリングしてますが、yの生成方法は前回と同じです。 さらに、xを同様にCosで求めるだけで、円形になります。

それぞれの周期が半分ずつずれてるので、うまい具合に円になってくれるのですが、 xとyにそれぞれCosとSin与えておけば円になるって覚えとけばなんとかなります。

f:id:rhythmcan0:20180613233826j:plain

あと、距離は円ということで 半径radiusに置き換えました。 円形なので、繰り返しについては正直意味がないんですが、 次の発展絵使えるのでとりあえず残しています。

また、真ん中の球はコピー元のオブジェクトです。 邪魔な場合は、createObjectにPrefabを指定するか、 円を生成後、createObject自体を消滅させても良いでしょう。

f:id:rhythmcan0:20180613234044j:plain

サンプルコード

using UnityEngine;

public class CircleObjectCreater : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 40; // 生成するオブジェクトの数

    [SerializeField]
    private float radius = 5f; // 半径

    [SerializeField]
    private float repeat = 2f; // 何周期するか

    void Start () {

        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π

        for (var i = 0; i < itemCount; ++i)
        {

            var point = ((float)i / itemCount) * oneCycle; // 周期の位置 (1.0 = 100% の時 2π となる)
            var repeatPoint = point * repeat; // 繰り返し位置

            var x = Mathf.Cos(repeatPoint) * radius;
            var y = Mathf.Sin(repeatPoint) * radius;

            var position = new Vector3(x, y);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }

        
    }
    
}

GitHub

github.com

発展

次は、Z軸も利用して螺旋状にオブジェクトを生成していきます。

【Unity】サインカーブ状にオブジェクトを生成する

説明

サインカーブ状にオブジェクトを生成します。

f:id:rhythmcan0:20180612232450j:plain

赤線は説明用の手書きです。

sinカーブを2周期で、20個のオブジェクトを生成。 全体の距離が20で、上下の振幅を2倍大げさに見せています。

各オブジェクトの配置間隔は 距離 / オブジェクト数 で求めています。

createObjectに設定したGameObjectを繰り返して貼り付けます。

f:id:rhythmcan0:20180612232453j:plain

パラメータの詳細はコードのコメントを参照してください。

サンプルコード

using UnityEngine;

public class ObjectCreaterCurve : MonoBehaviour {

    [SerializeField]
    private GameObject createObject; // 生成するオブジェクト

    [SerializeField]
    private int itemCount = 20; // 生成するオブジェクトの数

    [SerializeField]
    private float length = 20f; // アイテムの広がる距離

    [SerializeField]
    private float expantion = 2f; // 高さ変動の拡大値

    [SerializeField]
    private float repeat = 2f; // 何周期するか


    void Start () {

        var unit = length / itemCount; // オブジェクトの配置間隔
        var oneCycle = 2.0f * Mathf.PI; // sin の周期は 2π

        for (var i = 0; i < itemCount; ++i)
        {

            var ratio = (float)i / itemCount; // 周期の位置 (1.0 = 100% の時 2π となる)

            var x = i * unit;
            var y = Mathf.Sin(ratio * oneCycle * repeat) * expantion;

            var position = new Vector3(x, y);

            Instantiate(
                createObject, 
                position, 
                Quaternion.identity, 
                transform
            );

        }

        
    }
}

GitHub

gitHubにも上げているので、プロジェクトごと参照したい方はご利用ください。

( gitHubリポジトリ!! )

github.com

発展

次は、円状にオブジェクトを生成。 その後、球状にオブジェクトを生成してきます。

ThinkJapan 2018 IBM Code Day に参加してきました

IBM 主催の ThinkJapan CodeDay に参加してきました。

 

ibmevent.jp

 

おそらく、ThinkJapanとしてのイベント開催は初めてで、
昨年開かれていた、 IBM Watson Summit の後継イベントだと思われます。

 

会場は、品川にある グランドプリンスホテル新高輪 で、
すごく豪華な会場でした。

f:id:rhythmcan0:20180611220900j:plain

f:id:rhythmcan0:20180611220834j:plain

 

オープニングは、落合陽一さんや、Unityの大前さん、スクエニの三宅さん等、豪華メンバーが次々と登壇されていました。

落合さんは登壇者としても、パネルディスカッションの進行役としても参加されていたんですが、話を回すのがうまいし、展開を面白くするのにも気を使ってる感じだったし、研究者やアーティストとのしての面だけではなくほんと様々な技術を持ってるんだなぁと感心するばかりでした。

また、グラディ・ブーチさんと言うヒゲのおじいさんが登壇していて、誰だろうと思ってたんですが、この方、UML開発者の一人でスリーアミーゴスと呼ばれてソフトウェア設計者としても多大な貢献をされている方らしいです。


 

午後からはずっとセッションを聞いていたので、
その中から興味深かったセッションを紹介します。

 

及川卓也が聞くー すごいぞ!IBM Research 研究最前線 AIから世界最小コンピューターまで

IBM Researchの最新の研究内容の発表です。

いくつかお話が上がってそれぞれ面白かったのですが
特に興味深かったのがAIを使って新しい物質を作るという話。

現在人類が発見している物質は、およそ1,000,000,000(10億)種類らしいんですが、
まだ発見されていない物質は 1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000(10の62乗!)種類あるらしいです。。。。

そこで、AIを使う事によって、既存の物質パターンから、例えば高熱に強い等のパラメータを設定し、その条件に合う物質を生成させるんだとか。

また、なぜこういう事を研究しているのかというと、物質はそもそもテクノロジーの進歩の根源をなしており、CPUの小型化や、スマホの接触面の技術など、様々な物質の発見や効率の良い生成技術からテクノロジーの進歩が始まっているため、テクノロジーと物質は切り離しては考えれないらしいです。

最近OculusGoをやっててVR空間で無限世界が広がる!って思っていたけど、それも物質というテクノロジーに縛られた上での世界であって、決して完全な仮想ではないんだなぁと、なんだか思いを改めさせられました。

 

■本当に価値を生みだすデータ・サイエンティストがもつ共通点

IBM西牧 洋一郎さんのセッション。


SPSSと言うデータ分析をGUIで行えるツールの紹介だったんですが、
セッション中に簡単な分析をデモされていて、かなり簡単に
データ分析ができる感じで非常に興味深かったです。

さらに、データソースをDBやCSV等簡単に差し替えることもできたり。

また、西牧さんの経験上、データサイエンスの活用領域は主に
ヒトとモノを分析することに分類することができるらしい。

f:id:rhythmcan0:20180611233914j:plain

f:id:rhythmcan0:20180611233933j:plain

例えば、どういう属性のヒトが何を買うかっていうのは、
SPSSを使えばかなり簡単に導けるようでした。

ただし、その内容を鵜呑みにして現場に反映すると
大抵とんでもないことになるらしいです。

そのへんに業務活用のコツみたいなのがいるんでしょうが、
そのあたりについては詳細に語られなかったのでちょっと
重要な部分が足りない感はありますね。。

でも、データ分析をコードやSQL等をガリガリ書かずとも
簡単に扱えるのはすごく面白かったので、その分野のお仕事されている方は
一度確認しておいたほうが良いかもです。

 

IBM SPSS ソフトウェア/データ・マイニング、統計解析 - Japan

 

また、SPSSについては西牧さん自身の著書もあるみたいです。

 

実践 IBM SPSS Modeler~顧客価値を引き上げるアナリティクス

実践 IBM SPSS Modeler~顧客価値を引き上げるアナリティクス

 

 

■Developer Night

すべてのセッションが終了した後は、DeveloperNightでした。

交流会というよりは、昼間セッション続きで展示を見る時間がないため、

展示会場周りの為の時間という感じです。

 

ただし、ご飯やお酒つき!!

f:id:rhythmcan0:20180611230002j:plain

f:id:rhythmcan0:20180611230007j:plain

 

会場中にはDJの音楽が鳴り響く!!

f:id:rhythmcan0:20180611230026j:plain

 

展示会場では、VRコンテンツの体験コーナーだったり、ライトニングトークが各所で開催されていたり、多くの出展もありとても充実した内容でした。

 

f:id:rhythmcan0:20180611230341j:plain

f:id:rhythmcan0:20180611230325j:plain

f:id:rhythmcan0:20180611230450j:plain

f:id:rhythmcan0:20180611230439j:plain

 

量子コンピュータの展示も!!

 f:id:rhythmcan0:20180611230518j:plain

 

そして、偶然通りかかった、ブーチさんとも写真を撮っていただきました!!


f:id:rhythmcan0:20180611230629j:plain

 

単にWatoson興味で参加したイベントでしたが、得るものも多く充実した会でした。
来年も開催されたら参加したいです(^^)

「テスト駆動開発」を読んだ

t-wadaこと、和田卓人さんの翻訳本、テスト駆動開発を読みました。
著者はKent Beckさんです。
 
前半は、まどろっこしいくらい丁寧にテストに合わせた
コードの改変の流れを解説されています。
そのため、自身でコードを書かなくても流れがよくわかります。
リファクタリングのやり方も含んでいるため、
まだリファクタリングやテストに慣れてない人には
良い解説かもしれないです。
 
中盤ではテストを行う機構自体を実装するという流れ。
 
後半ではテストについてのパターンが解説されています。
 
個人的には、MockObjectについてもっと深く知りたかったのですが、
パターンの一種として触れられてる程度でした。
 
主にテストの書き方の解説に紙面が割かれているため、
テストの重要さなどは、よく読み込まないと理解が難しいかもです。
 
なので、これからテストを実装しないといけない人だったり、
テストの意義みたいなのはある程度理解していて、
それをどうやって組めばよいかという人向けのように感じました。
 
まだ自分自身よく理解できていない点も多くあるので、
他のテスト関連書籍などを渡り歩きながら
いずれまた読み返してみたいと思います。
  
 
テスト駆動開発

テスト駆動開発

 

  

 

一度絶版になった書籍だったようですが、
復刊にあたっての和田さん自身の記事がありました。

 

t-wada.hatenablog.jp