チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第49回:ヘッドアップディスプレイに株価を表示してみよう!

2013.11.11

  • Maya
  • ゲーム
  • チュートリアル
  • 中級者
  • 学生・初心者
  • 教育
  • 映画・TV
ん、どういうこと?タイトルの誤植??

と思った方もいらっしゃるかもしれませんが、間違いではありません:)
マジメな内容ばかりやっていても飽きてきますので、今回はしょうもないツールを作ってMayaの本領を発揮したいと思います!

ということでタイトル通り、Mayaのモデリングビューのヘッドアップディスプレイに株価を表示するツールを作ってみます。出来上がるとこんな感じになります。



なぜこれが必要なのか!そう、それが問題です。デイトレーダーな方はいつでも株価が気になるところではありませんか?仕事中でも株価を見たくて仕方がない、とはいえ会社のPC画面に株価を表示していれば、仕事をしていないのは明らかです。そこでコレ、Mayaのヘッドアップディスプレイです。まさかこんなところに株価が出ているなど誰も想像しませんから、通りすがりの上司がPC画面を監視しても「真剣にポリゴン数を確認していて感心だ…」とむしろプラス評価されてしまうかもしれません!他にもヘッドアップディスプレイで悪いことが出来そうですね…。

今回のツールの方法はMayaのさまざまなところに応用できますので、いろいろ改造してみてください。

では早速簡単なサンプルでテストをしながら作っていきましょう。
基本的な処理の流れは、
1. 株価の出ているサイトにアクセスして、テキストを取得
2. テキストから株価に関係する文字を検索して抜き出す
3. ヘッドアップディスプレイを作り、株価を表示する
という風になっています。



ウェブにアクセスするために今回はPythonを使います。


ウェブの取得

Pythonでは「urllib」という、ウェブにアクセスするためのモジュールが用意されています。ウェブアドレスを指定するだけで、そのページの内容をテキストとして取得できます。

次のスクリプトをスクリプトエディタで実行すると、Yahoo!のページ内容がスクリプトエディタに表示されます。今回のサンプルはPythonコードですので「Python」として実行するのを忘れないようしましょう!

import urllib                   # まず urllib モジュールを使えるようにインポート

url = 'http://www.yahoo.co.jp'  # url を設定。アドレスは何でもいいですがとりあえずヤフー
f = urllib.urlopen(url)         # urlopen にアドレスを指定すると、ページを開いてメモリに読み込みます
text = f.read()                 # すべてのテキストを一気に読み込みます
f.close()                       # ページを閉じます
print unicode(text, "utf-8")    # スクリプトエディタに表示。Mayaの文字エンコード(UTF-8)にします



いかがでしょうか?
スクリプトエディタのアウトプットに表示される文字はHTMLタグだらけの表示ですので、ウェブページが正しく読まれているかいまいち分かりにくいですが、これで正しく取得できています。

アドレスを変えればどのページでも読み込めますので、たとえばMayaを起動したときに所属しているプロジェクトのポータルページの情報を読み込んで、チームの最新情報を表示するなど応用できます。


株価の抜き出し

簡単にウェブページを取得できましたが、さて株価というピンポイントの情報を抜き出すにはどうすればよいでしょうか?

今回はヤフーをフル活用させてもらいましょう!ヤフーファイナンスにアクセスし、銘柄を選ぶと次のようなページが開きます。



このページの株価情報を抜き出して利用します。(上図の赤枠部分)
ヤフーファイナンスのウェブアドレスは、
「http://stocks.finance.yahoo.co.jp/stocks/detail/?code=4689.T」
という風になっており、数字の部分、つまり「4689」が銘柄の番号になっています。この番号を変えることで、ほしい銘柄のページにアクセスできます。なんと便利でありがたいことでしょうか…。

ウェブページ上で右クリックメニューを出すと、大抵のウェブブラウザでは「ソースの表示」項目があります。これを実行するとウェブページのHTMLが見られます。HTMLの中身で株価「475」を検索すれば該当部分を見つけられます。株価のところは、
「<td class="stoksPrice">475</td>」
と記述されています。

これもありがたいことにすでに「"stoksPrice”」というキーワードが入っています。Pythonで単純に「"stoksPrice”」という文字列を検索して、その次に出てくる「>」と「<」文字に囲まれている部分を抜き出せば株価が取れます。

株価を抜き出すところまで実装すると次のようになります。実行すると株価がスクリプトエディタに表示されます。(我々は一体何をしているのでしょうか…)

import urllib

stockNum = 4689
url = 'http://stocks.finance.yahoo.co.jp/stocks/detail/?code=%d.T' % stockNum
f = urllib.urlopen(url)
targetLine = ''
identifier = "\"stoksPrice\""                   # 株価のキーワード
for line in f.readlines():                      # 一行ずつ読むようにします
    text = unicode(line, "utf-8")
    if identifier in text:                      # キーワードが含まれているかどうか
        # e.g. <td class="stoksPrice">475</td>
        targetLine = text                       # 当たり。株価が含まれている行
        break
f.close()

if targetLine != '':
    #print targetLine
    words = targetLine.split(identifier)        # キーワードの部分で文字を分割
    # '<td class=' and '>475</td>\n'
        
    endIndex = words[1].find('<')
    
    price = words[1][1:endIndex]                # > と < に囲まれたところを抜き出します
    print price
    # 475



今回のサンプルでは銘柄名を抜き出しませんが、銘柄名は、
「<th class="symbol"><h1>ヤフー(株)</h1></th>」
となっているので「”symbol”」というキーワードで検索する処理も加えれば、銘柄名もウェブから取ってくることができます。


ヘッドアップディスプレイの操作

これで必要な情報はすべてそろいました。が、すでにお察しの通りこのままではPythonの機能だけで完結していてMayaの意味がないので、ヘッドアップディスプレイにかっこよく株価を表示することにします。

ヘッドアップディスプレイ(以下HUD)の表示をプログラムするのは難しそうに思えますが、実際はものすごく簡単に行えます。次のコードを実行すると、モデリングビューの左下にHUDが三行表示されます。

import maya.cmds as cmds
cmds.headsUpDisplay( 'HUDStockMarket1', section=6, block=0,
                     labelWidth=100, dw=200, l='stock: 500')     # HUD一つ目
cmds.headsUpDisplay( 'HUDStockMarket2', section=6, block=1,
                     labelWidth=100, dw=200, l='stock2: 4000')   # HUD二つ目
cmds.headsUpDisplay( 'HUDStockMarket3', section=6, block=2,
                     labelWidth=100, dw=200, l='stock3: 12000')  # HUD三つ目



「l=」(label=)のところに表示したい文字列を設定します。
「section」や「block」でHUDの表示する位置を決めます。大体こんな感じです。



「section」「block」を変えて好きな場所にHUDを出せますが、既にその場所が使われている場合はエラーが出て、追加できません。詳しくはheadsUpDisplayのMELヘルプをご覧ください。

作った後にHUDの有無を確認、削除することもできます。次のコードを参考にしてみてください。

# HUD の有無の確認
cmds.headsUpDisplay( 'HUDStockMarket1', q=1, ex=1)

# 既存の HUD のラベル上書き
cmds.headsUpDisplay( 'HUDStockMarket1', e=1, l='blah-blah')

# HUD の削除。対象は名前で指定。
cmds.headsUpDisplay( 'HUDStockMarket1', rem=1)
cmds.headsUpDisplay( 'HUDStockMarket2', rem=1)
cmds.headsUpDisplay( 'HUDStockMarket3', rem=1)

どんな情報でも簡単にHUD化して表示できます。ということで、こうして作ったHUDのラベルとして株価を出せばめでたく完成です。

ユーザーが追加表示したHUDは、今起動しているMayaだけで有効なものです。新しいシーンに変えても表示され続けまずが、Mayaを閉じると削除されます。Mayaを閉じてもファイルやMayaの設定を汚すことはありませんので、安心して追加することができます。

逆に言いますと、Mayaを立ち上げるたびにHUDを追加しないといけません。userSetup.mel内でHUDを追加するようにすれば、Maya起動時にHUDを追加できます。


仕上げ

株価をウェブから取ってくるコードと、HUDのコードを組み合わせて一つにしましょう。いろいろな実装方法があると思いますが、とりあえず次のようにしてみました。

import maya.cmds as cmds
import urllib

def getPrice( stockNum ):
    url = 'http://stocks.finance.yahoo.co.jp/stocks/detail/?code=%d.T' % stockNum
    f = urllib.urlopen(url)
    targetLine = ''
    identifier = "\"stoksPrice\""
    for line in f.readlines():
        text = unicode(line, "utf-8")
        if identifier in text:
            # e.g. <td class="stoksPrice">475</td>
            targetLine = text
            break
    f.close()
    
    if targetLine != '':
        #print targetLine
        words = targetLine.split(identifier)
        # '<td class=' and '>475</td>\n'
            
        endIndex = words[1].find('<')
        
        price = words[1][1:endIndex]
        return price
        # 475
    
    return -1


# HUD 作成
if cmds.headsUpDisplay( 'HUDStockMarket1', q=1, ex=1) == False:
    cmds.headsUpDisplay( 'HUDStockMarket1', section=6, block=0, labelWidth=100, dw=200)

# 株価取得と HUD へ設定
price = getPrice(4689)
cmds.headsUpDisplay( 'HUDStockMarket1', e=1, l=u'ヤフー: '+ price) # u'ヤフー' のuはユニコード指定。

このコードをスクリプトエディタにコピーして実行すると、こんな感じで株価が表示されます。



株価を更新したいときはもう一度実行します。
シェルフに入れておけば必要な時にいつでも株価を表示・更新できます。ボタンを押すのがドキドキですね。


さらに便利にするためには?

headsUpDisplayコマンドでは何かイベントが起きた時に関数を実行することができます。いわゆるコールバックです。シーンが開いたとき、オブジェクトの選択を変更した時などに指定した関数を実行して、表示内容を変えることができます。株価のアップデート関数を指定しておけば、もうちょっとリアルタイムに株価を表示できるようになります。ただし毎回ウェブにアクセスしに行くので処理が遅くなりそうですが…。

今回のPythonコードでは日本語文字列を使っていますので、単純に「.py」に保存するだけではMayaに読み込んだ際にエラーが起きてしまいます。エラーを起こさないようにするために「.py」の文字コードをUTF-8にして保存する必要があります。お使いのテキストエディタでテキストを保存するとき、もしくはファイルや編集メニューから文字コードを指定できるはずです。


まとめ

今回は「ウェブから情報をとってくる」「HUDを使う」という部分をさらっと見てきました。

株価のチャートの数字が取れれば、グラフエディタにでもアニメーションカーブとして株価チャートを表示したりもできそうですね…。



まあ今回の内容はなかなかしょうもなくてよかったのではないでしょうか?この内容の発展としてこんなことができそうです。

・ プロジェクト内のウェブから情報をとってきて、オブジェクトの名前やマテリアル名をつけるのに使う
  → オブジェクト名を間違えたりするヒューマンエラーの防止に期待!

・ 逆にシーン内の情報をウェブに書き込む。たとえばシーンのポリゴン数、テクスチャのパスなど。
  → モデルのデータベース化を少ない作業工数で実現!

・シーンに関連したバグトラッキング情報をウェブで検索、表示。解決したらバグトラッカーのステートを変更。
  → Mayaデータとプロジェクトの進捗の連携!
  → だれでも該当のMayaデータがどこにあるか把握できて、プロジェクト運営が安定!

うーむ、夢が広がりますね。これぞパイプラインに強いMayaという感じがしてきました。
今回の内容でしたら、小難しい数学やアルゴリズムがあるわけでなく、HTMLのタグをいじる感じのものですから、アーティストにもぜひ試していただければと思います。


Maya Learning Channel
製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。