ヘキサ日記 Blog

 

2016年8月31日

Live and Let Die

        

ヘキサ日記をご覧の皆さん、こんにちは。
プロジェクトマネージャーのKAZです。

 

私がヘキサドライブに入社して今回2回目のブログ登場です。

 

前回ブログ書いたのが、2016年5月30日だったので、
その日からちょうど3ヶ月が経ちました。
明日から9月です!(今年も残り1Qのみ。。。)

 

まだまだ暑い日が続きますが、いよいよ秋に突入ですね~

 

さて、秋と言えば、

 

食欲の秋

読書の秋

スポーツの秋

芸術の秋

行楽の秋

 

などなど、「~の秋」と色々言われますが、
皆さんにとって秋と言えば、何を一番に思い浮かべますか?

 

私は食べることも好きで読書も好きで、スポーツも好きで
(最近は観戦メインですが)、何が一番かは悩むけど
ここはあえて「ゲームの秋」と言っておきましょう!笑

 

はい、「ゲームの秋」。

毎年 9月には東京ゲームショウも開催されます。

 

ゲームするのはもちろん大好きですが、私はゲーム開発が仕事なわけで、
秋に限らず、春夏秋冬、年中ずっとゲームが一番です

 

つい先日、日本国内最大のゲーム開発者向けイベント/技術交流会である
「CEDEC 2016」(Computer Entertainment Developers Conference)に参加してきました。

 

今回のCEDECでも、とてもためになる話を沢山聞くことができましたが、今回最大の目玉はやはり、
ゲームデザイナーの堀井雄二さんとスクウェア・エニックス社の齊籐陽介さんによる基調講演
「ドラゴンクエストへの道 ~ドラゴンクエスト30周年を迎えて~」かと思います。

 

ドラゴンクエストの貴重な制作秘話を、ドラクエの生みの親である堀井さんから生で聞くことができ、
子供の頃からドラクエで育ってきた私にとって、とても貴重で嬉しい体験でした!

 

ネットにもレポート色々上がってるので、興味ある方は是非チェックしてみてください。

 

私は過去何度かCEDECに参加してるのですが、一番の思い出は、今から7年ほど前に行われた
「機動戦士ガンダム」の生みの親であり総監督でもある富野由悠季さんの基調講演です。

 

その基調講演に漏れ無く参加すべく、当日、朝早くから行って並んでたのですが

(早く行ったのに会場着いたら既に行列でした。。)、

その甲斐あってか、一番前から2列目のど真ん中の席で富野監督の話を聞くことができました。

私はガンダム好きで(宇宙世紀に限りますが)、富野監督の大ファンでして…

 

で、その時の演題はズバリ、「慣れたら死ぬぞ」でした!笑

 

「慣れたら死ぬぞ」の内容としては、ちゃんと書くと長くなるので割愛しますが、
富野監督が主張したかったことの論題の1つを要約すると、「ゲームの原理原則を考えなさい」でした。

 

 ・プレイヤーは何をもってゲームを楽しむのか?

 ・『人を楽しませる』という行為(エンタテインメント)の本質は何なのか? 

 ・これまでかつてこうだったから、今後もこれでいけるといった発想は危険

 ・何十年後か先のハードウェアやライフスタイルの進化を推測した上で,それに合わせたゲームを考えるべき

 

といったようなことを富野監督は講演で語ってました。

 

また、講演では「ゲームは悪」といった発言もしてて、噂どおりの毒舌もあり、富野節が炸裂してました!笑

 

7年前の話ですが、ネットにレポート上がってるかと思うので、もし興味ある方はご覧ください。

 

面白いゲームのアイデアを得る為には、色々な経験や刺激が必要かと思います。

 

おそらくゲームばかりやっててはダメで、映画やドラマを見る、観劇や舞台/ミュージカルなどを観る、
読書をする、スポーツをする/観る、旅行する、etc…
ゲーム以外のことから沢山の刺激をもらうことも必要かと思います。

 

慣れたら死ぬぞ!笑

 

といういことで、「○○の秋」的に、心地よい秋にはゲーム以外のことを色々やってみることをオススメします

 

最後に、今日は私が好きなこの曲をご紹介して、このブログを締めたいと思います。

 

Live and Let Die(邦題:死ぬのは奴らだ)
Guns N’ Roses Ver

 

この曲は、もともとPaul McCartney & Wingsの曲で、1973年のジェームスボンドで有名な映画
『007 Live and Let Die』の主題歌なので、映画通の方はご存知かもしれません。

 

慣れたらたら死ぬぞ!

 

死なない為に、慣れてはダメだ!

 

死ぬのは奴らだ!笑

Live and Let Die!

 

ではまた~


        

こんにちは

東京開発、デザイナーのモリモです。

前回まで2Dイラストを描いていましたが、今回からは立体に挑戦していこうと思います!

(前回までは右下カテゴリーのの画伯タグをどうぞ!)

以前の弊社の記事を見て立体出力をやりたいと思いたちまして、早速進めていきます!

 

↓まずはどんな物を作りたいか考えて絵にしていきます。

 image1

 

普通ですね。

あまりデザイン等凝りすぎると先に進まなくなるので、凝りたい気持ちはグッと抑えてシンプルです。(どうせ後から変えたい部分は出てくるので!)

そして やっぱりテイスト変えたいな~と ↓の感じに変更です。

okao

 

(真正面向いていてちょっと気持ち悪いですね・・・モデル作る時にはちゃんとポーズつけてあげようと思います!)

ちなみに上の絵は前回に引き続きデザイナーシマイに大々的に手を加えて頂きました!ありがとうございます!

 

挑戦シリーズ?第2弾

~終~

 

 

なぜ唐突に終わったかと言うと、圧倒的デッサン力不足の壁にぶち当たったためです!!

嘘です終わりません!

↓ というわけで、以下デッサン力向上のためのZBrushを使用した習作になります。お見苦しい箇所多々ありますが何卒お許しを!

kinnikuman2 kinnikuman

ムキムキのおっさんですね。

おっさんをいつまでも弄っていると士気が下がってしまうので同時進行で顔も作り進めていきます。

kao_wip2

↑ハゲてますね。次回更新時にはフサフサしているのではないでしょうか・・・!

 

今回は以上になります!

次回も暖かい目で見守って頂けると嬉しいです。


2016年8月29日

アザラシの秘密

        

こんにちは。おのってぃです。

先週の土曜日にテレビをつけながらスマホをいじっていると

ついていたニュースから「浅草で”三馬鹿アニマル”が開かれました。」という、とても気になるフレーズが聞こえてきました。

顔を上げて確認してみると”サンバカーニバル”でした。

なんでしょうね。三馬鹿アニマル。桃太郎のパロディでしょうか。

(ネット検索すると、やはり他にも聴き間違えた人はちらほらいるらしい)

 

 


 

 

話変わって今日は水族館についてです。

1ヶ月ほど前に江ノ島水族館でナイトアクアリウムなるものがおこなわれるという情報をゲットしたので行ってきました。

NIGHT WONDER AQUARIUM 2016

 

17時以降に館内がナイトアクアリウム仕様に切り替わるのですが、

通常の入館料を支払うだけで、追加料金無しで楽しめます。

もちろん17時以前から入館しておくことも可能です。

えのすい1

上記公式HPより

 

イベント時間になると、通路が普段とは異なる照明になり、

要所でプロジェクションマッピングのようなショーイベントがおこなわれています。

一部イベントでは何に注目して欲しいのか不明瞭で、まだ試行錯誤中なんだろうなと感じましたが、

大部分が屋内であるがゆえに、どの時間帯に行っても同じようなものが見られてしまう状況(←これ自体はメリットでもありますが。)に対して変化を生もうとする試みに非常に好感が持てました。

(魚に詳しくないので、「時間帯によって動きが違うよ」とかいうのは見分けられません、、、)

 

惜しむらくは日没と同じ時間帯におこなわれるイルカショーを見られなかったこと。

ナイトアクアリウムは数カ月おきに内容が切り替わり、12月までやっているらしいので

もう一度行ってみようかなと思います。

 

休日はやや引きこもりがちな性分なのですが、

やはり家の中では感じられない刺激をもらう経験も

知見を広げたり、流行を察知するためには必要ですね。

 

久々の水族館訪問で

「アザラシが水中で寝るときは縦になること」を見て知って安らいだ、おのってぃでした。


2016年8月26日

本日のmayaPython

        

皆様、スープカレーは食べていますか。

デザイナーのヨセミテです。

 

IMG_9756

今月の中ごろに目黒駅~恵比寿駅の間くらいにある薬膳スープカレー、シャナイアに行ってまいりました。

狭い路地の先にあり、駅からだと少々遠かったのですが、それでもお店は並んでいる人たちがおりました。かなり濃厚でとろみのあるスープでした。非常に美味しかったです。

 

住宅街の中にあるスープカレー屋さん、近隣の住民の方々が非常にうらやましい限りです。僕も家の前にスープカレー屋が欲しいです。

 


 

▼mayaPythonの話

最近は業務ではスクリプトから離れてSubstance等の業務が主でした。

ですので今回のブログ用のスクリプトは書いたのがえらく久しぶりな気がします。

 

前々からちょっと考えていたスクリプトで、ヒストリを操作するためのものです。

 

ヒストリを操作する機会はあまり頻繁には無いのですが、いざ複数を触る必要が出てくると、

 historyEditor 1

ここ(赤枠)にたどり着くのがわりと面倒だと思っていたので作ってみました。

作成はPymelです。パフォーマンスは望めないのですが、やはりPymelは思いついたものを形にするという意味では非常に優れていますね。

選択したオブジェクトのヒストリをリストアップし、選んだヒストリをON、OFF、削除が出来るようにしました。

historyEditor 4

historyEditor 3 historyEditor 5

 

 

※先にも述べましたがヒストリはMayaのクラッシュの原因になる可能性が、非常に高い部分です。スクリプトを利用する場合は自己責任の上でお願いします。

 

以下、ソースです。

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
##########################################
# 8月26日ブログスクリプト

import pymel.core as pm

class commonValue():
    ### =====================================================
    ### 定数定義
    ### =====================================================
    # list Param
    historyListFieldManageName  = "historyListFieldManageName"
    historyListFieldSize        = {"w" : 256, "h" : 512}

    # button Param
    buttonTitle_loadHistory = "Load History"
    buttonTitle_historyOn   = "on  History"
    buttonTitle_historyOff  = "off History"
    buttonTitle_historyDel  = "delete History"

    buttonFieldSize         = {"w" : 128, "h" : 512}
    buttonSize              = {"w" : 128, "h" : 64}

    # window Param
    windowTitle         = "BlogScript --- HistoryEditor"
    windowManageName    = "historyEdiroManageName"
    windowSize          = {"w" : historyListFieldSize["w"] + buttonFieldSize["w"],
                           "h" : 512}

class main(commonValue):
    ### =====================================================
    ### 実行クラス
    ### =====================================================
    # uiname
    UI_historyList = ""

    # インスタンス変数
    listedDict = {}     # リスト化されたヒストリの情報を格納するための領域
    listedObjects = []  # リフレッシュする際に再読み込みをするオブジェクト

    # 取得変数と表示内容への変換
    displayFormat_historyVisible = {0:True, 1:False}

    ### =====================================================
    ### 処理用の関数
    ### =====================================================
    def getHistoryTree(self,targetNode):
        # -----------------------------------------------------
        # 全ヒストリを取得する
        # -----------------------------------------------------
        return pm.listHistory(targetNode)

    def listReflesh(self):
        # -----------------------------------------------------
        # テキストリストを削除
        # -----------------------------------------------------
        selectionIndex = self.UI_historyList.getSelectIndexedItem()
        self.UI_historyList.removeAll()
        self.listedDict = {}
        return selectionIndex

    def recoverySelection(self, indexList):
        # -----------------------------------------------------
        # 指定のインデックスを選択
        # 再選択に失敗するようならパスで
        # -----------------------------------------------------
        try:
            self.UI_historyList.setSelectIndexedItem(indexList)
        except:pass

    def listAdd(self, addText = ""):
        # -----------------------------------------------------
        # テキストリストに項目を追加
        # -----------------------------------------------------
        self.UI_historyList.append(addText)

    def listGetSelection(self):
        # -----------------------------------------------------
        # テキストリストの選択項目を取得
        # -----------------------------------------------------
        selectionIndex = self.UI_historyList.getSelectIndexedItem()
        resultList = []
        for n in selectionIndex:
            resultList.append( self.listedDict[n])
        return resultList


    def addListedData(self,listIndex,  node):
        # -----------------------------------------------------
        # 取得したヒストリノードの情報を格納
        # -----------------------------------------------------
        nodeState = pm.getAttr("{}.nodeState".format(node))

        thisNodeData = {"node": node,
                         "state": nodeState}
        self.listedDict[listIndex] = thisNodeData
        return thisNodeData

    ### =====================================================
    ### 処理用の関数
    ### =====================================================
    def makeUI(self):
        # -----------------------------------------------------
        # UI作成メイン
        # -----------------------------------------------------
        self.makeUIParts_createMainWindow()
        mainLayout = pm.rowLayout(nc = 2)
        with mainLayout:
            self.makeUIParts_historyListField()
            self.makeUIParts_buttonField()
        pm.showWindow()

    def makeUIParts_createMainWindow(self):
        # -----------------------------------------------------
        # メインウィンドウ作成と有無の確認
        # -----------------------------------------------------
        if pm.window(commonValue.windowManageName,ex = True):
            pm.deleteUI(commonValue.windowManageName)
        window = pm.window(commonValue.windowManageName,t = commonValue.windowTitle)
        return window

    def makeUIParts_historyListField(self):
        # -----------------------------------------------------
        # 取得したヒストリのリストを表示する領域
        # -----------------------------------------------------
        with pm.columnLayout():
            self.UI_historyList = pm.textScrollList(commonValue.historyListFieldManageName,ams = True,
                                                    w = commonValue.historyListFieldSize["w"],h = commonValue.historyListFieldSize["h"])

    def makeUIParts_buttonField(self):
        # -----------------------------------------------------
        # UIの作成
        # -----------------------------------------------------
        with pm.columnLayout(w = commonValue.buttonFieldSize["w"], h = commonValue.buttonFieldSize["h"]):
            pm.button(label = commonValue.buttonTitle_loadHistory,  w = commonValue.buttonSize["w"], h = commonValue.buttonSize["h"],
                      command = pm.Callback(self.UICommand_loadHistory), bgc = [0.6,0.6,0.6])
            pm.button(label = commonValue.buttonTitle_historyOn,    w = commonValue.buttonSize["w"], h = commonValue.buttonSize["h"],
                      command = pm.Callback(self.UICommand_onHistory))
            pm.button(label = commonValue.buttonTitle_historyOff,   w = commonValue.buttonSize["w"], h = commonValue.buttonSize["h"],
                      command = pm.Callback(self.UICommand_offHistory))
            pm.button(label = commonValue.buttonTitle_historyDel,   w = commonValue.buttonSize["w"], h = commonValue.buttonSize["h"],
                      command = pm.Callback(self.UICommand_deleteHistory), bgc = [0.5,0.2,0.2])

    ### =====================================================
    ### UIからの呼出し命令
    ### =====================================================
    def UICommand_loadHistory(self, targetNodes = None):
        # -----------------------------------------------------
        # --- UIからの呼びだし命令
        # ヒストリの呼びだし
        # -----------------------------------------------------
        selectionIndex = self.listReflesh()
        self.listedDict = {}
        self.listedObjects = []

        # 指定のノードが存在する場合はそれらを対象とする
        if targetNodes:
            selectionNodes  = pm.ls(targetNodes)
            targetNodes = None
        else:
            selectionNodes  = pm.ls(sl = True)

        listIndex = 1       # textScrollListのindexは1から始まるので初期値1

        for currentNode in selectionNodes:
            addSourceText =   "sel : {}".format(currentNode)
            self.listAdd(addSourceText)
            gettedHistory   = self.getHistoryTree(currentNode)
            thisNodeData = self.addListedData(listIndex,  currentNode)
            self.listedObjects.append(currentNode)              # リスト作成時に選択していたオブジェクト
            listIndex +=1   # index表記タイトル分

            for currentHistory in gettedHistory:
                thisHistoryNodeData = self.addListedData(listIndex,  currentHistory)
                addNodeText =   "    {} : {}".format(thisHistoryNodeData["node"], self.displayFormat_historyVisible[thisHistoryNodeData["state"]])
                self.listAdd(addNodeText)
                listIndex +=1
        self.recoverySelection(selectionIndex)

    def UICommand_onHistory(self):
        # -----------------------------------------------------
        # --- UIからの呼びだし命令
        # ヒストリのオン
        # -----------------------------------------------------
        listSelection = self.listGetSelection()
        for currentSel in listSelection:
            pm.setAttr("{}.nodeState".format(currentSel["node"]),0)
        selectionIndex = self.listReflesh()
        self.UICommand_loadHistory(self.listedObjects)
        self.recoverySelection(selectionIndex)

    def UICommand_offHistory(self):
        # -----------------------------------------------------
        # --- UIからの呼びだし命令
        # ヒストリのオフ
        # -----------------------------------------------------
        listSelection = self.listGetSelection()
        for currentSel in listSelection:
            pm.setAttr("{}.nodeState".format(currentSel["node"]),1)
        selectionIndex = self.listReflesh()
        self.UICommand_loadHistory(self.listedObjects)
        self.recoverySelection(selectionIndex)

    def UICommand_deleteHistory(self):
        # -----------------------------------------------------
        # --- UIからの呼びだし命令
        # ヒストリの削除
        # -----------------------------------------------------
        listSelection = self.listGetSelection()
        selectionIndex = self.listReflesh()
        for currentSel in listSelection:
            print currentSel
            pm.delete(currentSel["node"])
        self.UICommand_loadHistory(self.listedObjects)
        self.recoverySelection(selectionIndex)

    def create(self):
        #-----------------------------------------------------
        # main
        #-----------------------------------------------------
        self.makeUI()


### === そのまま打ち込み用実行文
historyEditorInstace = main()
historyEditorInstace.create()

 

作ってみてから思いましたが、実際に利用する際にはソート機能やフィルタ機能も入れると便利そうですね。

今回は主に自分のための復習でした。次の投稿では自分の勉強のためにAPI2.0を使って何か作ってみたいと思います。

それでは。

 


        

まだまだ暑いですね

デザイナーのモリタです。

 

最近は、新卒採用で応募されてくる作品等を見る機会も何故か多くなりました。

 

これから一緒に仕事をしていく未来の仲間を・・と、

自分なりにしっかり拝見させていただいているわけですが・・やはりまだまだ学生さん。

——-

「モデルの作りこみがちょっと・・」

「動きに自然な感じが・・」

「デッサンが少し・・」

「作品の内容が偏っていて判断が難しい・・」

「作品の制作時間や説明が書いてない・・」

「履歴書の字が読みづらい・・」

———

と、ともすれば何やらアラ探し大会みたいにおかしな方向になる時もあって

選考ってこんなに大変なんだ・・!と思う時もあったりします。

 

採用するorしないの段階でも、自分の一意見で、

この人の人生に変化を与えてしまうんだ・・と考えはじめるともう・・

普通に作業しているほうが楽ですね。

 

なんて瞬間もありつつも、パソコンに現実逃避するわけにもいかないので 、

しっかり全力で選考していますよ

 

・・そういうわけで、選考時には色々と意見を言って色々と話をしているわけですが、

ふと 「じゃあお前はどうだったのよ?」と思ってしまったのが・・運の尽き・・。

 

丁度、実家に夏休み帰省することがあったので

自分の元部屋のあそこにあるかな・・と思って探したら・・

 ありましたよ・・19年前ほどの就職活動で使った専門学校時代の作品が・・!

 

で、それがこれ。(バインダーに入ってた各用紙をスキャンしました。鉛筆画はマンガとか雑誌とかからです。)

20160825_works

いやー。死にたくなりました。(言い訳はしません)

 

当初、思いついて探そうとする前は、

「さすがに20年近く前だし、もはや他人事のようにさらっと見られるだろう。さらっと」

と思いきや、見つけてバインダー開いた瞬間・・

体中から血を吹いて脳梗塞で死にそうになるとはこのことか。

というような感覚のガクガクをしてしまいました。(吐き気も少しあったかな)

 

まあ・・でも アウトプット(この場合供養的な意味で)するということは大事だし

このブログでご縁があってここを見る機会のある就職活動中の学生さんの

勇気、希望、安心になるならそれもまたヨシ! という心の遷移です。

 

なんていうか・・時効ということで色々とご理解賜れれば幸いです。(言い訳してますね)

そしてイマドキの学生さんは頑張ってますね・・!

 

というわけで、説明しがたいある種のやる気的な感情(ヘキサ)が動いた(ドライブ)学生の皆様はこちら

リクナビ2018サイト

こんなの出すとか勇気あるなあ。と思っていただけたキャリアな方はこちら

ヘキサ採用情報

 

それではまた!


2016年8月24日

1dayインターンシップ

        

みなさんこんにちは!
最近、夏バテ気味のさとうです!

 

今回は先日開催した
2018年度新卒向けの1dayインターンシップの様子をご紹介します~

 

弊社の1dayインターンシップは・・
「ゲーム業界を知る」「ゲーム制作を体験する」 この2つの要素を盛り込んだ1dayインターンシップです!
ゲームクリエイターとしての一歩を踏み出したい方を歓迎します!

 

P1080711

まずは自己紹介~(写真が暗くてすいません・・!)

 

P1080715_顔ぼかし

ワークショップの様子です~
グループに分かれてゲーム制作を疑似体験して頂きます!
同じチームの仲間と一緒に、ゲーム制作のおもしろさや大変さを体験・・
最後に発表もしてもらいます~

 

P1080722

懇親会もあります~
ここからは先輩社員も加わり、質問タイム開始です!!
和気藹々な雰囲気で懇親会は終了します~

 

ヘキサドライブは2018年度の新卒採用に向けて、始動しております!
1dayインターンシップは、また開催する予定ですので

ご興味がある方はぜひ弊社のリクナビ2018サイトを見てみてください

それではまた★


        

こんにちは。まつおです。

 

昨日の台風9号はすごかったですね。
自分の住んでいる町田市では午前4時59分に大雨、洪水警報が発令、
午前11時には土砂災害警戒情報に伴う避難勧告が出されていました。
近所を流れる境川はすごいことになっていたようですが、
自宅は開設された避難施設から近いこともあって無事でした。
家のすぐ目の前にある調整池はほぼ満水状態でしたけどね。。。
すでに台風10号も発生しているようなので、皆さん気をつけてくださいね。

 

ところで、これまでバイクや車の話をしてきましたが今回は趣味のゴルフの話です。
この業界、特に現場にはゴルフする人があまりいない(というか、ほぼいない)ので
あまり共感はしてくれないと思いますが、楽しいですよ。ゴルフ。

 

やらない方のためにちょっと触れておくと、ゴルフって基本4人1組でラウンドします。
ですが、4人そろえるのって結構大変なんですよね。
2人1組や3人1組だと割り増し料金取られるケースも少なくないし。。。
ところが最近は1人予約っていう便利なシステムが存在します。
これはネット上で1人で予約を入れておき、プレイ予定日前日の指定時間までに
人数が揃えば予約が成立してラウンド出来るってシステムです。
当日、現地で初顔合わせになるので、最初はちょっとドキドキしましたが、利用して
いるうちに顔馴染もできたりして結構楽しいですよ。
また、ゲームで言うフレンド設定がこのシステムにはあって、以前一緒にラウンドして
気のあった人を登録しておくと、次の予約を入れたときに互いに通知が飛びます。
この通知を受けて同じ枠に予約を入れれば、また一緒にラウンドできるって仕組みです。

 

自分は10年以上遠ざかっていたのですが、ここ数年、このシステムを使って
ゴルフを再開しました。
自分と同じ様に昔はやってたんだけど、また興味はあって始めてみたいんだけど
周囲にゴルフする人がいなくてって方は是非こうしたシステムを利用してみてください。
今は同様のシステムがいろいろあるようですが、自分が利用しているのは下記になります。

http://www.valuegolf.co.jp/one.cfm

 

あっ、ちなみに自分の腕前ですが、今年は念願だった90切りも何度か達成しました!
まぁ、100叩くこともざらにあるんですけどね。。。よかったら誘ってください。


        

みなさんこんにちは。グリフォンです。

本日東京は台風に見舞われて服がびしょびしょです。

 

さて今回は真面目なお話です。

以前、デモプログラムの方で

【距離情報によるテクスチャ画像のベクトル化】-Distance Field Texture Vectorization-

というものを紹介しましたが、

つい先日、某プロジェクトで使うためにDistance Field Textureを作る必要が出てきました。

ただ用意するための期間があまり無かった為、今回はUnityを使用してDistance Field Texture生成ツールを作ってみました。

 

ゲームエンジンとして広く普及しているUnityですが、

色々なファイル読み込みに対応しているので、ちょっとしたツールを作るときも重宝します。

 

大まかな処理の流れは以下

フォントを1文字ずつ読み出してピクセル情報を取得

ピクセル情報からDistance Field情報を生成

CharacterInfoを生成

アトラステクスチャに書き込む

アトラステクスチャとFontSettingsを出力保存

 

 

今回はを説明していきます。

フォントを1文字ずつ読み出すために今回はUnity標準のuGUIを使用しました。

blog20160822_1

 

CanvasとTextとCameraが1つずつあるだけのシンプルなシーンです。

このTextに使用するフォントと文字サイズやスタイルなどを設定しておきます。

 

このシーンを再生して、Textに1文字ずつ文字を設定し、RenderTexture機能を使ってピクセル情報を取得します。

private IEnumerator GenerateCharacterTexture(string character)
{
  // 描画する文字を設定(1文字)
  _TextArea.text = character;

  // 文字の領域サイズを取得
  //  フォントによって正しくサイズが取得できない場合があるので、幅・高さの大きいほうで正方形にする。
  int width  = Mathf.CeilToInt(_TextArea.preferredWidth * _Param_QualityScale);
  int height = Mathf.Max(width, Mathf.CeilToInt(_TextArea.preferredHeight * _Param_QualityScale));
      width  = height;

  // 書き出しテクスチャ・レンダーテクスチャを領域サイズに合わせて生成
  _BufferTexture = new Texture2D(width, height, TextureFormat.ARGB32, false);
  _RenderTexture = new RenderTexture(width, height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default);
  _MainCamera.targetTexture = _RenderTexture;

  yield return 0;  // レンダーテクスチャが反映されるまでの待ち

  // キャンパスを強制更新
  Canvas.ForceUpdateCanvases();

  yield return 0;  // キャンバスを最新にするための待ち
    
  // レンダーテクスチャからピクセルを情報取得
  RenderTexture.active = _MainCamera.targetTexture;
  _BufferTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
  _BufferTexture.Apply();
}

_TextArea が Textコンポーネントを設定したメンバ変数です。

_MainCamera も同じく Cameraコンポーネントを設定したメンバ変数。

_BufferTexture と _RenderTexture はそれぞれ Texture2D と RenderTexture 型のメンバ変数。

 

17行目では直前でCameraに設定したRenderTextureに描画するため次のフレームまで待ちます。

 

ここでuGUIの落とし穴がありました。

本来はこの時点でRenderTextureに描画されているハズですが、uGUIのコンポーネントは設定した内容が直ぐに反映されませんでした。

 

そこで20行目で Canvas.ForceUpdateCanvases() を呼んで明示的にCanvasを更新します。

その後、描画されるのを待ち次のフレームでようやくRenderTextureの内容が取得できるようになります。

これら2回の待ち時間は回避できないので120FPSなど高速処理することで対処するしかないです。

 

このあたりはuGUIの処理最適化などの影響だと思われますが、

通常のゲームでも即時でUIを更新する必要がある場合は参考にしてください。

 

 

今回はここまで。以降はまた次回をお楽しみに


        

こんにちは。

東京ラテアーティスト見習いの足立です。

 

はい、今回のネタはラテアートです。

ちょっと前に東京オフィスにエスプレッソマシンが導入されまして、

一部の人間の間でラテアートをしようと盛り上がっています。

 

 

ラテアートには、

 

・ピックやチョコソースなどを使ってスチームしたミルクの上に模様や絵を描くエッチング(デザインカプチーノ)

 

・スチームしたミルクのみをつかって注ぎながら模様を描いていくフリーポア

 

の2種類があるのですが、我々が目指しているのはフリーポア。

ハートやリーフをススッとスマートに描いてキめたいとこですが・・・

これが奥が深くて難しい!!

 

エスプレッソを入れるにしてもいくつものポイントがあるのですが、

とくに苦戦しているのがスチームミルク!

泡立てと攪拌がなかなかうまくいかず・・・

って、つべこべ言ってないで描いたものを見せろって感じですかね。

 

いいでしょう。今朝作った力作、ごらんあれ!

 

20160819_cafe

ドヤァ

 

あ、微妙って思ったね?

いやいやホント難しいんだって!!

これでも今までで一番のデキなんだからね!!!

チクショー!今からもう一回作ってくる!!!!

 

・・・・

 

・・・

 

・・

 

 

いや~、 今日も暑いね~。みんな熱中症には気をつけてね☆

あ、話変わるけどこのゲームおすすめだよ!

じゃまた

 


        

台風がやって来て、夏も後半戦ですね。

現在リオオリンピック真っ最中ですが、中でも体操女子S.バイルス選手の床の演技を見て感動した

モーションデザイナーのおおみやです。

 

今回は前回に続いて、MAYAでこちらのgifのような「殺陣アニメーション」を作成してみます。

一週間前からコツコツと準備を始めましたので、その過程も紹介したいと思います。

 

blog_anim1

かなりざっくりとしてますが、こちらが完成のイメージ

どこからかニャン○大戦争という声が聞こえてきますが、どんどん行きます。

 

前回のブログはこちら

前々回のブログ

前回のブログ

 

■一日目

anim01

リグの作成。2体分は面倒なので一体で作業します。

今回は動かしませんが、耳や尻尾などにも仕込んでみました。

 

■二日目

anim02

元々softImage3Dを使っていたので、ウィンドウを沢山出さずに、このような画面で作業しています。

stepカーブでざっくりとカメラアングル殺陣の段取りなど全体の動きと尺を確認します。

 

動画で見るとこんな感じです。動きがカクカクしています。

 

■三日目~

後はコツコツと作っていきます。カメラに映っていないところはわりとざっくりしています。

完成のイメージがあるので迷い無く作業を進められます。

 

■最終日

カメラの確認と全体のメリハリの調整。一度クリップ化してトラックスエディタで編集しています。

投げ技による立ち位置の入れ替わり、複雑さうねりが出ていたら成功ですが、どうでしょうか。

 

■おまけ

蛇足ですがviewport2.0でも出力してみました。

SSAOはお手軽ですね、プレビズ作成に便利です。最新のMAYA2017に搭載される

Arnoldもとても楽しみです。

 

次回はモーションキャプチャーで細かい動きを作ったり、尻尾や耳を動かしたり、

伸縮を入れて作り込んだり、ダミーモデルからちゃんとしたモデルに差し替えたり、

ユニティやUE4で編集したり、色々遊んでみようかと思います。

 


 

ヘキサドライブでは、殺陣の勉強で新宿のサムライブさん、板橋のスタジオ@Bosさん

殺陣の体験をさせて頂いたり、パフォーマンスキャプチャーの勉強でツークン研究所さん

伺ったり、アクティブに活動しています。

 

情熱を持って、キャラクターに命を吹き込みたい!もの作りをしたい!という

モーションデザイナー希望の方、ぜひ、ヘキサドライブにご応募下さい。

 


 

それではまた。


ヘキサブログ ピックアップ



過去の日記はこちら

2016年8月
« 7月   9月 »
1234567
891011121314
15161718192021
22232425262728
293031