ヘキサ日記 Blog

 

        

こんにちは

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

 

今回はMaya2017で追加されたヘアーツールで髪の毛を作っていこうと思います。

使うのは以下の2点

・ボーナスツールのCurve to Ribbon Mesh

・XGen Interactive Grooming(次回)

 

今回はCurve to Ribbon Meshを利用して前髪を作成します。

(※こまめにセーブしましょう!)

 

(1)

サーフェスチューブでCVカーブのベースを作ります。

ヘアー1

 

 

(2)

サーフェスからCVカーブを複製

作成したらレイヤー分けと、

後々の工程では束ごとにグループ分けをしておくと見やすいです。

ヘアー2

 

 

(3)

CVカーブを選択しBonus Tools > Modeling > Curve to Ribbon Mesh

ヘアー3

板ポリゴンを選択し、チャネルボックスから以下の機能で調整出来ます。

・Width 板ポリの幅

・Curvature 法線方向に移動

・Orientation 回転

・Taper 毛先へ向けて幅の広さを変更

・Twist 根元を残してツイスト回転

 

 (4)

立体的な形状になるようOrientationで隙間を埋めていきます。

ヘアー5

 

 

(5)

テクスチャを適用して完成です!

ヘアー4 

 

 ~次回へ続く~

 

次回は ↓のかつらの部分から、 Interactive Groomingで残りの髪の毛を作成していこうと思います!

ヘアー6

 

 

 

Interactive Groomingについてのページ紹介

Tarkan Sarim氏によるデモ

非常に細かく作りこんでいます!これを見るだけで流れが把握できます。

XGen インタラクティブグルーミング

ヘアーから板ポリゴンへの変換

 AUTODESK公式

 

 

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


        

初夏、青葉が目に眩しいこの頃。皆様いかがお過ごしでしょうか。
爽やかな筋肉痛に包まれている、とりっぴーです

 

先日、某がブログで告知をしていましたが、「A 5th of BitSummit」に出展して参りました。

 

今回Ficustone projectブースでは
2017年夏リリース予定の魔法パスワード1111の試遊と、
「Ficustone project 設定資料集+開発資料集」と「アクリルキーホルダー」の物販を行いました。

 

ブースの展示風景はこのような様子でした
今回は初めてオリジナルのグッズも製作しましたが、様々な方々にお手に取っていただきありがとうございました。

20170524_0 20170524_3

 

前作アイテム代は経費で落ちない ~no item, no quest~(略称:アイ経)

ネリネとウィルも、お手伝いしてくれましたよ

 20170524_2 20170524_1

 

開発スタッフの私としましては、ゲームの開発段階で様々な方に遊んでいただけることは、大変貴重な経験です。

普段は中々、ユーザー様の遊んでいるご様子は見えませんが、
「ゲームを楽しんでいただけているか」「きちんと遊びの面白さは伝わっているか」「このUIの部分は分かりにくかったかな」「難易度は適切だったか」「もっとこうした方が面白くなるのでは」…などなど
直接いただいた反応から、本当に多くの気付きや学びがあります

 

足を運んでいただいた皆様、BitSummitやご関係者の皆様、ありがとうございました。
前作の「アイ経」をプレイしてくださった方も多くいらっしゃり、とても嬉しかったです。
今回のフィードバックを活かして、ゲームをさらにブラッシュアップしていきたいと思います

 

  

さて、BitSummitの翌日はお休みをいただいて、かの有名な伏見稲荷大社を観て参りました。

お天気に恵まれ、雲ひとつ無い晴天で気温は32℃
鳥居の赤木々の緑が補色で映えて素敵です!

20170524_4 20170524_9

 

伏見稲荷と言えば、皆様ご存知「千本鳥居」で有名ですが、
これだけたくさんの鳥居があると、多種多様な朽ち方をしていて興味深かったです

20170524_7  

 

ウィル&ネリネのふたりも、記念にパシャリ

20170524_5

 

ところどころ撮影もしつつ、ゆっくりと景色も堪能できました。

20170524_6 20170524_8

 

最終的に、「四つ辻」という京都を一望できる絶景スポットまで登りました。
空気が澄んでます!(まだ中腹なのですが、このあたりでふくらはぎがプルプルに…)

20170524_10

 

 

 

その後は、京都駅に戻りお土産などを見て回りました。
京都駅は洗練されたデザインで素敵ですね

20170524_12

 

最後に晩ご飯を食べて思いましたが、京都のご飯は本当に美味しいです
デザートは八橋が上に乗った抹茶杏仁豆腐をいただきました
20170524_11

 

観光の様子が多くなってしまいましたが、今回はこのあたりで。

それでは、魔法パスワード1111夏のリリースに向けて
引き続きチーム一同、皆様に楽しんでいただけるように尽力しますので、
今後ともFicustone projectを宜しくお願い致します

 


2017年5月23日

本日のMaya Python API 2.0

        

こんにちは、ヨセミテです。

スープカレー、最近はラマイにしか行ってません。割愛。

 


 

今回は何を取り扱うか、前日にAPI2.0のドキュメントを眺めてどれにしようか考えてました。当日にドキュメントを眺めだした前回とくらべると非常に大きな進歩ですね。

 

今回はポリゴンモデルを操作するために用いられる基本的な5つのAPIクラスと銘を打たれているクラスを扱ってみます。丁度前回ふれていない方のMIt~の方のクラスが多いです。

 

MItMeshPolygon

MItMeshEdge

MItMeshVertex

MItMeshFaceVertex

MFnMesh

 

要はポリゴン、頂点、エッジ、UV、メッシュ全体などです。しょっちゅう使いますがあんまりしっかりまとめたことが無かったのでまとめてみます。

これらは同様の流れで使用する準備を整えることが出来ます。

 


 

前回同様に適当なメッシュを用意して、

適当なメッシュ

前回同様にMGlobalクラスでメッシュのDagPathを取得します。

import maya.api.OpenMaya as om2
selList    = om2.MGlobal.getActiveSelectionList() # 選択対象からSelectionListを取得
selDagPath = selList.getDagPath(0)                # MSelectionListからindexを指定してDagPathの取得

で、DagPathを、引数にしてインスタンスを作成。全部同じ形です。

# メッシュ関連のライブラリは全てメッシュのDagPathを定義時に指定することで操作できる
mitMeshPolygonIns  = om2.MItMeshPolygon(selDagPath)
mitMeshEdgeIns     = om2.MItMeshEdge(selDagPath)
mitMeshVertIns     = om2.MItMeshVertex(selDagPath)
mitMeshFaceVertIns = om2.MItMeshFaceVertex(selDagPath)
mfnMeshIns         = om2.MFnMesh(selDagPath)

 これで上記の各クラスのリンク先にある処理を利用できるようになりました。

# 例えば割り当てているindexのエッジの隣接フェースを取得できます。
mitMeshEdgeIns.setIndex(6) # indexの指定
connectedFace = mitMeshEdgeIns.getConnectedFaces()
print connectedFace

 MIt~のクラスはイテレーターという連続処理に特化したクラスであり、.next()で順番に全ての要素にアクセスしていく、もしくは.setIndex()で指定のindexにアクセスするという処理を行います。

# イテレータをまわして全フェースのを面積調べる
mitMeshPolygonIns.reset()                  # .resetで現在のindexを初期化できます。
print mitMeshPolygonIns.index()            # .indexで現在のindexを調べられます。
for n in range(mitMeshPolygonIns.count()): # .countで全体の長さを調べられます。
    faceSize = mitMeshPolygonIns.getArea()
    print faceSize                         # フェースの面積
    mitMeshPolygonIns.next(1)              # なぜかポリゴンだけnextに引数が必要…?ドキュメントに書いてないんで多分バグ

 MItMeshPolygonの不審な挙動発見

イテレーター自体に関しては本来のPythonにある実装なので興味のある人はググって見てください。

 

もうちょっとAPI2.0での処理をかいてみましょう。

定義さえ済ませてしまえばcmdsやMELとさほど違いはありません。

# イテレータをまわして全頂点を -1 ~ 1 範囲でランダムに移動
import random
mitMeshVertIns.reset() # .resetで現在のindexを初期化できます。
for n in range(mitMeshVertIns.count()):
    randPos = [random.uniform(-1,1),random.uniform(-1,1),random.uniform(-1,1) ]
    currentPos = mitMeshVertIns.position()
    PosData = om2.MPoint(currentPos[0] + randPos[0], currentPos[1] + randPos[1], currentPos[2] + randPos[2])
    # 座標データはopenMayaの座標データ用のインスタンスで求められる場合も結構あります。
    mitMeshVertIns.setPosition(PosData)
    mitMeshVertIns.next()
# イテレータをまわしてフェースの方向が下を向いているポリゴンを削除する
mitMeshPolygonIns.reset()
targetIndex = []
valueLambda = 0.00001 # 許容誤差
for n in range(mitMeshPolygonIns.count()):
    currentNormal = mitMeshPolygonIns.getNormal()
    xFlag =  0.0 - valueLambda < currentNormal[0] <  0.0 + valueLambda
    yFlag = -1.0 - valueLambda < currentNormal[1] < -1.0 + valueLambda
    zFlag =  0.0 - valueLambda < currentNormal[2] <  0.0 + valueLambda
    if xFlag and yFlag and zFlag:
        targetIndex.append(mitMeshPolygonIns.index())
mitMeshPolygonIns.next(1)
for n in targetIndex[::-1]:
    mfnMeshIns.deleteFace(n)    # MFnメッシュクラスはMIt~で取得したインデックスを指定して色々出来る

 


と、いうことでMeshのAPIはメッシュのDagPathを取得すればこのように大体利用できます。あとはリファレンスを見て何をしたいかに応じて試してみてください。

 

経験上、cmdsやMELを使っている人がAPIに移行する際に一番大きな障害になるのはAPIの利用方法です。使い方さえわかってしまえば色々なプロセスを効率化していきたい人たちもいるかなと思います。

Maya Python API 2.0 は非常に使いやすい仕組みに作られているので興味のある人が使ってみて、利用者が増えていってくれれば良いですね。

 では。

 


2017年5月22日

筋肉+計測=????

        

昨日の快晴の中、海辺でピザ窯で焼いた自家製ピザとバーベキューをいただいていたので、

逆に太陽に体力を奪われてしまい身体がだるいおのってぃです。

 

今日は前々回に予告した気がする筋肉の活動を取得する機械について説明しようかなと思います。

いきなりですが、全体像がこれ。

DSC_0027

サイズ感が一切わからないですね。。だいたいタバコ箱程度の大きさです。

 

諸般の事情で電子回路を触る人にはわかる程度にざっくりと全体の構成を書くだけで、回路図は割愛させていただきます。

・1次増幅器 ・・・ だいたい10~50倍程度のごく普通のオペアンプを利用した反転増幅器です。

・2次増幅器 ・・・ 数百倍オーダーのごく普通のオペアンプを利用したハイパスフィルタ(だいたい5Hz)、ローパスフィルタ(だいたい1000Hz)付き反転増幅器です。

・出力先 ・・・ 上記写真には写っていませんが、出力はモノラルフォンプラグにしているので、そのままPCにさすことでマイクからの入力として筋肉の活動を取得できます。加工もなんでも思いのまま。

 

~~

高精度でノイズレスにするためには大型化や複雑な回路になるのですが、

生体活動を計測する仕組みのコアそのものはシンプルだったりします。

このような計測機器を利用したものが、アミューズメント施設にあってもよさそうなのになと思っていたこともあるのですが、結構大きな問題がつきまとっていることに気づき今ではあきらめムードです。

 

①ケーブルが揺れるととても大きなノイズが発生する(定期健診などの心電図検査ではそうならないように横になるはずです)。

②周りに機械が多数存在しているとノイズが発生する。同じコンセントにアースがついていない他機械のプラグをさすなんて以ての外(定期健診などの心電図検査ではそうならないように専用の部屋があるはずです。)。

③後ろや横を人が通っただけでノイズが発生する場合がある(定期健診などの~以下略)

(④そもそもそのような専用コントローラを準備して面白いゲームができるのか)

 

個人として勝手に作って勝手にコントローラなどをハックして勝手に楽しむ分には可能だと思いますが、

商品として提供するにはこの技術では無理かなぁ、と思います。

 

書きながらふと思ったのですが、もしかしたら「戦場の絆」のような筐体で「戦場のダイモス」を作れば、

もうそれは原作を再現できて、一部嬉しい人々もいるかもしれません。

しかしダイモスを知っている世代が限定されているので、

どこかで再放送をしていただけないものでしょうか。

かくいう僕もまともに全話見たこと無いので。

 

~~

なぜこの記事がダイモスの再放送希望に着地してしまったのか自分でも不思議です。

世の中不思議なことっていくらでもあるんですね。

ではまた。


        

こんにちは。ブリテンです。

 

今年は(というか今年も)数多くの注目映画が公開されていますね!

最近公開されたのはこちら 

20170519_gotg

 

「ガーディアンズ・オブ・ギャラクシー リミックス」

(原題:Guardians of the Galaxy Vol.2)です!

 

私は諸々の事情でまだ観ていないのですが、

一作目がとても面白かったので、楽しみにしています。

20170519_gotg1

ガーディアンズ・オブ・ギャラクシーといえば、

70s~80s洋楽が豊富に使われていることで有名ですが、

『Come And Get Your Love』と共に始まるOPは、とてもいいシーンです。

なぜならば、このOPを見れば、

 

■映画全体の雰囲気

■映画内世界の技術水準

■映画内世界の生物

■主人公の性格

■主人公のスペック

 

がわかるからです。

 

このOPには、セリフがありません。

映像と楽曲で構成されています。

つまり、言葉を使わずに物語を語っているわけです。

 

これは所謂「演出」のことなのですが、

普段映画を見る時、

「このシーンは一体何を語っているのだろう?」と考えながら見ると、

クリエイティブに活かせる、新たなものが見つかるかもしれません。

 

 

 

 

 

 

 

 

 

 

 

 


        

ラーメン少女・ミェンミェンが気になっているこの頃。
某(なにがし)です

 

今週末の5月20~21日、国内最大級のインディーズゲームイベント
「BitSummit」
が京都市勧業館みやこめっせにて開催されます。

 

A 5th Of BitSummit 公式サイト

 

とてもたくさんのゲームが、クリエイターが集う、熱いイベントです

 

今年は弊社も出展しますので、
是非とも足を運んで頂けたらと思います!

 

弊社のBitSummit参加は、
2014年の「ダイコン王の野望ッッッン!!」出展以来となります。

 

あれからヘキサのオリジナルゲーム開発は続いていまして、
昨年秋にはスマホゲーム
「アイテム代は経費で落ちない~no item, no quest~」(略称:アイ経)
をリリースしました。

 

アイテム代は経費で落ちない~no item, no quest~ 公式サイト

アイ経は先日、全世界で10万ダウンロードを突破したばかりです!めでたい!
(でも、綴りは間違ってる・・・)

 

既にアイ経のコンテンツ追加は終了しましたが、
アイ経チームは引き続きオリジナルゲーム制作のため再出発しました

 

それが、オリジナルゲームブランド

 

「Ficustone project(フィクストーン・プロジェクト)」

 

です

20170518_ficustone

プロジェクトロゴは、ヘキサイメージの六角形が入っています

 

現在、Ficustone project第2弾タイトルとして
「魔法パスワード1111」(略称:まほぱす)
を開発中です!

 

魔法パスワード1111 ティザーサイト

 

BitSummitでは、「まほぱす」の試遊版を出展します!
まほぱすのバトルが簡単に体験できる内容になっているので、遊んでみてください

 

そして、さらに!

 

今回は新たな取り組みとして、
Ficustone projectグッズの販売も同時に行ないます

アクキーがなかなかきれいな仕上がりで良いんですよ

 

「設定資料集+開発資料集」については、
「アイ経」と「まほばす」の設定資料&開発資料を本にまとめたものとなります。

 

せっかくインディーズゲームイベントに出す、ということだったので、
開発の裏側を書くと面白いんじゃないか!?
と思い、企画書仕様書といった開発資料も入ってます。

 

なかなか珍しいのではないでしょうか

 

ゲーム開発に興味のある方にも、
きっと楽しんで頂ける内容かと思います

 

以上がヘキサの出展内容です

 

ということで、
今週末の予定が空いている方は、BitSummitに足を運んでみませんか


2017年5月17日

静岡ホビーショー2017

        

こんにちは!モリタです。

暑かったり、寒かったり、丁度良かったりする日があって、体調管理も大変ですね・・。

 

そんな日々が続きますが、

先週の休みは静岡ホビーショーに行ってきました!
20170517_静岡ホビーショー01
タミヤ本社。この中にも入れましたー。

 

初めて来たので、分かれている2会場(タミヤ本社⇔ツインメッセ静岡)を

シャトルバスで行き来するのがちょっと大変でしたが
自衛隊からの参加もあったりと、普段見られないものがたくさんあって面白かったです! 

 

20170517_静岡ホビーショー02
LAV・・ちょっと思い出として聞きたくない名前でしたが・・。

 

20170517_静岡ホビーショー03
横山 宏 氏の素晴らしい作品!

 

20170517_静岡ホビーショー04
渋めな辺りをうろうろと・・職業柄、建物の構造はどうも見てしまいますね

(ちなみにこちら6万円とのこと・・) 

 

20170517_静岡ホビーショー05
これが艦これか・・!

 

色々な展示物があって楽しかったです!
ただ、ありすぎて広すぎて、時間の都合もあってガンダムや美少女は見れなかったのです 

 

普段モニターでしか見ていないようなものを
実物で見るとやはり刺激を受けますね!

うまく立ち回れてなかったのもあるので、また機会があれば行きたいと思います!
それではまたです~


        

最近は寒かったり暑かったり
衣替えの時期がよく分からない・・こんにちは  さとうです

 

さて、本日は中途採用向けの合同説明会についてのお知らせです!

 

『 DODA 転職フェア 』
  日時:5月20日(土) 11:00~18:00
  場所:大阪(梅田)ハービスホール
     大阪府大阪市北区梅田2-5-25

 

大手・優良企業が集まり、採用担当者から”生”の情報を収集できます!
ヘキサドライブも参加しますので、ぜひお越しください♪

 

会場でお会いできることを楽しみしています

 

それではまた


        

みなさんこんにちは。

週末にボルダリングに行ったおかげで筋肉痛中のグリフォンです。

 

さて今回も前回の続き「フォントのDistanceFieldTexture生成ツールをつくる」のその4です。

 

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

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

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

CharacterInfoを生成

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

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

 

 

今回はを説明していきます。(後半戦です)

private bool WriteOutputFontTexture(string writeChar)
{
    var srcPixels = _BufferTexture.GetPixels32();
    var srcWidth  = _BufferTexture.width;
    var srcHeight = _BufferTexture.height;
    var dstPixels = _OutputFontTexture.GetPixels32();
    var dstWidth  = _OutputFontTexture.width;
    var dstHeight = _OutputFontTexture.height;

    while( _OutputPageNo < 4 ) {
        if( dstHeight > _OutputOffsetY + srcHeight ) {
            if( dstWidth > _OutputOffsetX + srcWidth ) {
                // 現在の行に収まる
                {
                    // ピクセルコピー
                    for( int y=0; y<srcHeight; ++y ) {
                        for( int x=0; x<srcWidth; ++x ) {
                            var srcPos = (y * srcWidth) + x;
                            var dstPos = ((_OutputOffsetY + y) * dstWidth) + (_OutputOffsetX + x);
                            switch( _OutputPageNo ) {
                                case 0: dstPixels[dstPos].r = srcPixels[srcPos].a; break;
                                case 1: dstPixels[dstPos].g = srcPixels[srcPos].a; break;
                                case 2: dstPixels[dstPos].b = srcPixels[srcPos].a; break;
                                case 3: dstPixels[dstPos].a = srcPixels[srcPos].a; break;
                            }
                        }
                    }

                    // テクスチャに反映
                    _OutputFontTexture.SetPixels32(dstPixels);
                    _OutputFontTexture.Apply();


                    /** ここに前回の「文字情報を成形」を挟みます **/
                    
                    
                    // 書き込み情報を更新
                    _OutputOffsetX     = _OutputOffsetX + srcWidth;
                    _OutputOffsetNextY = (int)Mathf.Max(_OutputOffsetNextY, _OutputOffsetY + srcHeight); // ←高さが高いオフセットを保存
                }
                return true; // 書き込み成功
            }
            else {
                // 次の行へ
                _OutputOffsetX     = 0;
                _OutputOffsetY     = _OutputOffsetNextY;
                _OutputOffsetNextY = 0;
            }
        }
        else {
            // 次のページへ
            _OutputPageNo++;
            _OutputOffsetX     = 0;
            _OutputOffsetY     = 0;
            _OutputOffsetNextY = 0;
        }

    return false; // 書き込み失敗
}

 

今回のアトラステクスチャはRGBAチャンネルに別々の文字郡を格納していきます。

 

_OutputPageNo が現在の格納先チャンネルを表しています。(0=R, 1=G, 2=B, 3=A)

 

_OutputOffsetX ・ _OutputOffsetY が書き込むピクセルの基準座標になります。

 

そして今回のポイントは、_OutputOffsetNextY です。

_OutputOffsetY が有るにも関わらず、なぜ別に必要なのか

 

それは、文字ごとに高さが違うからです。

今回のアトラステクスチャには、まずX方向に1行ずつ埋めていき、次にY方向に1行ずらしてまたX方向に埋めていきます。

 

そのため、_OutputOffsetY のみだと1行の最後の文字の高さが低い場合、次の行の文字が重なってしまいます。

20170516_ng

 

そこで、1行のうちで最も高い高さを _OutputOffsetNextY に保持して次の行のオフセットとして使います。

20170516_ok

これで文字が重なることはなくなります。

 

今回はここまで。次回はいよいよラストですお楽しみに


        

こんにちは。東京デザイナーの足立です。

 

最近他のデザイナーがSubstanceDesignerネタをちょいちょいあげてるので、

マネして何か作ってみることにしました。

 

お題は「雑草の生えた地面」ってとこで

いきなり全ノードはこんな感じ。

SB_blog01

 

はい、一目見てうんざりしますね。

悪い例です。

見た目だけでも綺麗にしようと申し訳程度にフレームで囲ったりしてみたんですが・・・

これ他の人がデータ触るとなったらエライことですよ。

データは綺麗に簡潔に!

 

 

では、雑草をどうやって作っていったか紹介。・・・ってほどのことしてないけどね。

 

「Shape」ノードの「ディスク」を変形させてベースとなる形を作って、

そこにグラデーションなどを重ねていき、「指向性ワープ」でさらに変形させたりします。

SB_blog02

 

同じようにしてこんな形や

SB_blog03

 

こんなディティールを追加してみたり

SB_blog04

 

と、いろいろと試行錯誤して、それぞれ「Tile Sampler」で配置したのちブレンド。

ブレンドモードは「最大(明)」で。

SB_blog05

 

これにカラーをのせて、ハイトを見ながら細かい調整をしたりして

最終的に出来上がったのがこちら

SB_blog06

 

草をもっとフワッと柔らかい感じにしたいんですが、今の自分の力量ではコレが精一杯。

まだまだ修行不足です・・・。もっと勉強してココで色々紹介できるようにならなきゃですね。

 

 

最後にSubstanceあるある!

地面系のテクスチャつくると、無駄に水溜り作りたくなる~

SB_blog07

SubstanceDesigner5.6で追加された「Water Level」で簡単に作れるようになっていい感じ。

ってやらない?

 

 

 


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



過去の日記はこちら

2017年5月
« 4月    
1234567
891011121314
15161718192021
22232425262728
293031