「絶対少年」のカメラアングルと会話のテンポが好き
「絶対少年」というアニメ作品を見た。前半1クールと後半1クールで舞台が変わるのだが、前半の演出がとても印象深かったので、主に前半について感じたことをまとめておく。
幻想的な空気を出すカメラアングル
・手前の人物のふくらはぎしか映らないカットで、対話が進むシーン
・人物が米粒のような極端なロングショットから、急にアップショットやクロースアップに変わる緩急
・電柱などの遮蔽物ごしのカット
・喋っている人の顔が映らないカット
・ローアングル
・オフナレ(景色が映っているけど、誰かが喋っている等)
など、変に多用すると奇をてらった画になりそうなカットがごく自然に登場する感じが良い。
・微妙に噛み合わない会話(ところどころ反応が省略されていて、リアルだがハイコンテクスト)
・変なことを言うキャラ(みく、平五郎さん)
・非日常の現象や思い出せない記憶などの不穏な設定
・終始抑揚の低い会話の声
・彩度の低い背景画
などとの相性が良い選定なのだと思う。
第1クールで超常現象の謎は、謎ではなく日常的に存在するものだ、という扱いになったので、14話目以降の第2シーズンでは、こういったイレギュラーなカットは減っている。
柔らかいが不安を煽るBGM
不協和音を使ったBGMは、”恐い”とか”緊張する”というレベルではないものの不安を感じる絶妙な柔らかさの曲が何曲かあり多用されている。
不気味な森の前で、主人公が引き込まれそうになる直前で、鳥が羽ばたく音が入ってきてBGMが途切れ環境音に切り替わるシーンがあるのだが、そういったBGMを使うべきところ、そうでないところの選定も心地よい。
心の機微を追いかける脚本
主人公は夏の一時的に地方に来たストレンジャーで、地域の同年代の子どもと徐々に距離を詰めていくのだが、その地元の友だち同士も思春期で感情の変化が進んでいく。物語の本筋は、忘れていた過去の記憶を思い出しながら主人公が超常現象を通じて自分の内面と向かい合っていく話だが、そこに周りの人の感情が上手く絡まっていきドラマチックになっている。
・ちょっと苦手な子が距離を詰めてきて何となく避けてしまう(本当はその子を避けたかったのに、”雨だから迎えに来て”と別の理由で親の車に乗せて貰うことで避けようとする)
・微妙に気になる程度の子から連絡があったけど自分宛ではなく妹宛であることにガッカリする。
・地元の中でも別荘地住まいの半ストレンジャーの子は、地元の祭りやコンビニを敢えて悪く言って自分の元都会アイデンティティを維持しようと失礼な発言をする。
・約束に誠実であろうとするもその約束が他の約束と重なって重荷になる
等々、よくここまで細かく描けたなという内容が、少ない会話で進んでいく。
第2クールでは、逆によく喋るキャラクターばかりになる。
そちらは、人付き合いが苦手な4人が少しずつ改善していく話しなのだが、自分の判断軸が無くて常に他人に媚びへつらうマッキーであったり、他人の気持ちを察せないで冷たいことを言うシゲキであったり、良い子であるべきだという謎の義務感に縛られたリエゾー等々、個性的なキャラクターが登場する。駄目な人の描き方が秀逸なのだが、自分には毒が強かった。マッキーの着信履歴でケータイのお知らせ欄が埋まるのは流石に恐い。
参考資料
こういう視聴者が少なく認知度が少ない作品でもしっかり捉えているのは、流石アニメスタイル。これによると変わったカメラアングルを多用しているのは、間を持たせるためだったという。
インタビュー中「何も事件が起きない」と言っているのは恐らく「動きのある画になるような事件がない」ということだと思う。登場人物の心情変化は毎話毎話変化があり、物語としては事件が起き続けているからだ。
サントラは在庫切れで再販の予定は今のところ無いようなのが残念だ。
FM音源でランダムに音色を作る
FM音源でランダムに音色を作る
FM音源とは、Frequency Modulation(周波数変調)を使った音色合成で、ヤマハが発明し過去は特許となっていた。
サイン波の周波数部分を更にサイン関数で変動させることで様々な音色を作ることができる。特に、金属系の音色を作ることに長けているようだ。
今回は、構造自体がとても簡素である点に着目して、FM音源の仕組みでランダムに音色を作ってみる。
FM音源の作り方はこの本を参照した。ここまで初心者向けに丁寧な音の説明とプログラムの用意がある本はなかなかないだろう。
下準備
wavファイルの取り扱いや音の再生、グラフ表示などで必要となる関数をインポートする
import numpy as np #sin関数を作るのに必要 #import scipy.signal as sp #sin関数を作るのに必要 import wave as wave #wavファイルに吐き出したり(読み込んだりするのに必要) import sounddevice as sd #jupyter notebook上で音を再生するために必要 import random as random #ランダムに数値を発生させるために使う import matplotlib.pyplot as plt #波形を確認しておきたいのでmatplotlibも使う %matplotlib inline
この辺りはこの本であったり、Web上の諸先輩方を参考にする。
基本となるデータや空の行列の用意
秒数やサンプリング周波数などを決めておく
totalduration = 4.0 #時間、秒 fs = 44100 #サンプリング周波数。sfでなくてfsと書く習慣になった理由はよくわからない
秒数は時点に変えておく
t = np.arange(0,fs*totalduration)/fs #時間を時点に変換 t
array([0.00000000e+00, 2.26757370e-05, 4.53514739e-05, ...,
3.99993197e+00, 3.99995465e+00, 3.99997732e+00])
FM音源
メインのサイン関数がキャリア。サイン関数の中で変動させる周波数部分がモジュレーターと呼ばれる。 それぞれの音の大きさ(振幅・amplitude)を格納するnumpy行列を容易しておく。
ac = np.zeros(len(t)) #キャリア am = np.zeros(len(t)) #モジュレータ
キャリア側振幅の設定
音色のどこを調整するか(エンベロープ)については、「Attack(立ち上がり)、Decay(減衰)、Sustain(減衰後の保持)、Release(余韻)」の考え方を利用する。まだ自分の理解が足りていないのだが、物体の振動数の特徴を再現するのによく考えられた仕組みだと思う。
先程の本に則って金属系の音を出してみる。勿論、エンベロープをかけることは必須ではない。
ADSRの初期値
この辺りの関数も先程の本の関数を借用する。ここに詳しい紹介がある。Cを前提にプログラムが書かれているが、シンプルなのでどの言語でもできる。著者がコードをこちらで公開している。
gate = fs*4 #単音の減衰が始まるまでの秒数 duration = fs*4 #単音の秒数。ここでは4秒 A = 0 D = fs*4 S = 0.0 R = fs*4
ADSRによるエンベロープの関数を定義
def ADSR(e,A,D,S,R,gate,duration): if A!=0: for i in np.arange(0,A,1): e[i]=1.0-np.exp(-5.0*i/A) elif D!=0: for i in np.arange(A,gate,1): e[i] = S+(1-S)*np.exp(-5.0*(i-A)/D) else: for i in np.arange(A,gate,1): e[i] = S if R!=0: for i in np.arange(gate,duration,1): e[i] = e[gate-1]*np.exp(-5.0*(i-gate+1)/R) return e
キャリア振幅にエンベロープを適用
ac = ADSR(ac,A,D,S,R,gate,duration) ac
array([1. , 0.99997166, 0.99994331, ..., 0.00673852, 0.00673833,
0.00673814])
モジュレータ側振幅の設定
こちらも同様にエンベロープをかけておく
gate = fs*4 duration = fs*4 A = 0 D = fs*2 S = 0.0 R = fs*2
am = ADSR(am,A,D,S,R,gate,duration) am
array([1.00000000e+00, 9.99943312e-01, 9.99886628e-01, ...,
4.54076515e-05, 4.54050774e-05, 4.54025035e-05])
合成
FM音源のポイント。キャリアとモジュレーターの周波数の比率を調整することで、FM音源は様々な音色を見せる。
キャリア周波数
キャリア側の周波数を決めておく。中央のA4のラは440kHzなのでそれを採用してみた。
fc = 440.0 #キャリア周波数
モジュレーターの周波数
乱数の発生
今回はその周波数比を自分で考える代わりに、適当に乱数で比率を決めてみる。再現性の確認のため、randomseedを使う。2倍なら1オクターブ上の倍音が、0.5倍なら1オクターブ下の倍音が出るということになるのだが、どれくらいの幅までやってみるかは好みではないかと思う。非整数倍の音を出したいので、今回は、1~99までの整数を発生させて10で割ることにする。
random.seed(42) #よく42が使われるのだが、「銀河ヒッチハイク・ガイド」のネタだと思う ratio = random.randint(1,99)/10 print(ratio)
8.2
seed値を使わなけば、実行する度に様々な音色が生まれる
周波数の設定
上記の比率をキャリア周波数にかけてモジュレーター側の周波数を決める
fm = fc*ratio
print(fm)
3607.9999999999995
音源化
事前情報は揃ったので、キャリア・モジュレーターの振幅と周波数でサイン波の合成を行う。先に行列の箱を作ってfor文で格納しているのだが、本当はもっと良い方法があるような気がする。
z = np.zeros(len(t))
for n in np.arange(0,len(t),1): z[n] = ac[n]*np.sin(2*np.pi*fc*n/fs)*(1.0+am[n]*np.sin(2*np.pi*fm*n/fs))
print(z)
[ 0. 0.09344876 0.23210877 ... -0.00125979 -0.0008426
-0.00042212]
音の確認
sounddeviceライブラリを使うとjupyter notenook上でも音が再生できる
sd.play(z,fs) print("再生中") status=sd.wait()
再生中
WAVEファイルへの書き出し
wavファイルには整数値で入れる必要があるが、Pythonの整数値には上限がある。上限を超えると音が狂うので、範囲に収まるようにスケーリングする。16bitで量子化するのでint16の上限値以内に収まるようにする。
print(np.iinfo(np.int16).max)
32767
z2 = (z/z.max())*np.iinfo(np.int16).max #スケールを整数のマックスに
整数値に変換
z2 = z2.astype(np.int16) #2バイトデータ化
書き出しには、waveライブラリを使用する。
wave_out = wave.open("./FM_220326_seed42.wav","w") wave_out.setnchannels(1) #モノラル音源 wave_out.setsampwidth(2) #16bitなので2byte wave_out.setframerate(fs) wave_out.writeframes(z2) wave_out.close()
波形をグラフ化
作った音がどんな波形なのかは気になると思うので、確認する
fig,ax = plt.subplots(1,1,figsize=(15,3)) ax.plot(t,z) ax.set_xlim(0,0.5) plt.savefig("FM_220326_seed42_graf_001.png") plt.show()
表示する区間が長過ぎると潰れてよくわからないのでもっと短い秒数で確認する
fig,ax = plt.subplots(1,1,figsize=(15,3)) ax.plot(t,z) ax.set_xlim(0,0.01) plt.savefig("FM_220326_seed42_graf_002.png") plt.show()
エンベロープなし
エンベロープをかけないシンプルな音だとどうなったも確認してみたい。振幅をとりあえず1にしておく。
amp = 1.0
z_simple = np.zeros(len(t))
for n in np.arange(0,len(t),1): z_simple[n] = amp*np.sin(2*np.pi*fc*n/fs)*(1.0+amp*np.sin(2*np.pi*fm*n/fs))
結論から言うと余り面白い音にはならなかった。エンベロープのテクニックがわりと重要に思える。
sd.play(z_simple,fs) print("再生中") status=sd.wait()
再生中
z_simple_2 = (z_simple/z_simple.max())*np.iinfo(np.int16).max
z_simple_2 = z_simple_2.astype(np.int16) #2バイトデータ化
wave_out = wave.open("./FM_220326_seed42_simple.wav","w") wave_out.setnchannels(1) #モノラル音源 wave_out.setsampwidth(2) #16bitなので2byte wave_out.setframerate(fs) wave_out.writeframes(z_simple_2 ) wave_out.close()
番外、ffmpegによる音の映像化
音声ファイルだけをYoutubeにアップロードすることはできない。適当に画像を貼って映像化するなら映像編集ソフトを立ち上げるよりffmpegで変換する方が楽だろう。
ffmpeg -loop 1 -i FM_220326_seed42_graf_001.png -i FM_220326_seed42.wav -vcodec libx264 -pix_fmt yuv420p -shortest FM_220326_seed42.mp4 ffmpeg -loop 1 -i FM_220326_seed42_simple_graf_002.png -i FM_220326_seed42_simple.wav -vcodec libx264 -pix_fmt yuv420p -shortest FM_220326_seed42_simple.mp4
pythonでピンクノイズを作成する
ただの雑音にしか聴こえないホワイトノイズと比べてピンクノイズは心地よい雑音だと言われている。
試しに人工的にピンクノイズの定義通りにピンクノイズをPythonで作成してみる。
必要な関数のインポート
wavファイルの書き出しにはwave
jupyter notebookで音を確認するためにはsounddeviceライブラリを使う
import numpy as np import scipy.signal as sp import wave as wave import sounddevice as sd
波形やスペクトログラムを見るためにmatplotlibも使う
import matplotlib.pyplot as plt %matplotlib inline
基本となるデータや空の行列の用意
作る音の秒数を決める
duration = 1.0 #時間、秒
作る音のサンプリング周波数
fs = 44100 #サンプリング周波数
時間をサンプリング周波数で割り、時刻を時点に変えておく
t = np.arange(0,fs*duration)/fs #時間を時点数に変換 t
array([0.00000000e+00, 2.26757370e-05, 4.53514739e-05, ...,
9.99931973e-01, 9.99954649e-01, 9.99977324e-01])
ベースとなる振幅
amplitude = 1.0 #振幅
基本周波数を用意
f0 = 440.0 #周波数 基本周波数
音のデータを格納していくための空のnumpy行列を作る。要素同士を足し算するので、numpy行列の方が便利。
z = np.zeros(len(t))
x = 周波数,y=振幅の2乗(パワー)のグラフを後で描くので、こちらは空のリストを用意しておく
x = []
#y = []
pow_y = []
乱数によるピンクノイズの作成
「パワー(=振幅の2乗)が、周波数に反比例する」がピンクノイズの定義。
import random
for i in np.arange(1,44): j = random.randint(1,44) z = z + np.array((pow(amplitude*(1/(f0*j)),1/2))*np.cos(2*np.pi*f0*j*t)) #y.append(pow(amplitude*(1/(f0*j)),1/2)) pow_y.append(pow(pow(amplitude*(1/(f0*j)),1/2),2)) x.append(f0*j)
z
array([0.56661722, 0.2356651 , 0.09015804, ..., 0.1562426 , 0.09015804,
0.2356651 ])
音の確認
sounddeviceライブラリで再生する
sd.play(z,fs) print("再生中") status=sd.wait()
再生中
WAVEファイルへの書き出し
Pythonの整数値には上限があるので、上限の範囲に収まるようにスケーリングする。
16bitで量子化するのでint16の上限値以内に収まるようにする。
np.iinfo(np.int16).max
32767
z2 = (z/z.max())*np.iinfo(np.int16).max #スケールを整数のマックスに
整数値に変換
z2 = z2.astype(np.int16) #2バイトデータ化
書き出し。
wave_out = wave.open("./sin_220319_008.wav","w") wave_out.setnchannels(1) wave_out.setsampwidth(2) #16bitなので2byte wave_out.setframerate(fs) wave_out.writeframes(z2) wave_out.close()
波形をグラフ化する。時刻毎の振幅
fig,ax = plt.subplots(1,1,figsize=(8,3)) ax.plot(t,z) #z2でも同じ ax.set_xlim(0,0.01) plt.savefig("sin_220319_008.png") plt.show()
周波数特性のグラフ。
横軸を周波数に縦軸を振幅にするが、ピンクノイズであることがわかりやすいように、x,y軸ともに対数軸にし、yの値は振幅ではなくパワーにしておく
fig,ax = plt.subplots(1,1,figsize=(8,3)) ax.scatter(x,pow_y) ax.set_yscale('log') ax.set_xscale("log") plt.savefig("spectr_220319_008.png") plt.show()
対数軸にしたときに周波数と振幅が綺麗な右肩下がりになるような雑音がピンクノイズと言われているので、その通りの音になっていることが確認できる。
Pythonを使ったWAVEの取り扱いはこの本で紹介されているのが今の所、丁度良いのではないかと思う。
Cを前提に書かれているが、音に関する理解を深めるならこの本が丁寧。
true tears は、音も本も映像もいい
「true tears」を始めて観た。余りに良くできていたので1周目は徹夜で13話視聴し、2周目は1週間かけて13話視聴した。原作が恋愛アドベンチャーゲームだし脚本が岡田麿里さんなので、好き嫌いは別れると思うのだけど、特に苦手が無いのであれば観てみて損は無いと思う。
この辺りが特に良かったなというところを幾つか忘れないうちにメモをした。
絵について
緩急が良い
俯瞰のカットから足元のアップだったり顔のアップだったりと絵の変化がありどれも意図を感じて過不足ない。敢えてドア越しのカットになって誰か登場人物の視線を意味していることを伝えるカットがあるかと思えば、小津安二郎のような正面撮りのようなカメラマンの存在を感じるカットもある。ところどころ作りが映画っぽい。
絵だけで見せるカットがある
脚本家と監督が十分連携できていたということだと思う。目が写らない程度のアップの表情にパラをかけて、暗い感情を表現したり、絵だけで意味が伝わってくる。
表情が良い
実写で言うと役者の表情の芝居ということになるのだけど、本作では登場人物が怪訝な表情をしたり、ハッと驚いたりというシーンが多くある。作画監督が調整したのか毎話顔も同じで安定しているので、あのとき全然違う表情をしていた同じ登場人物が今は違う感情を持っているのだ、ということがとても良く伝わってくる。
本について
嫌なことを自然に言わせる
敢えて人を傷つける台詞を入れて登場人物に反省させる、というシーンはどんな作品にもあるが、本作では嫌味や嘘を日常的に発してしまうこととして頻発させていて、とてもリアリティがある。岡田麿里さんは残酷な描写も多いと思うけど、登場人物に嫌な奴をちゃんと演じさせるところがあり、キャラクターに入れ込んでしまうタイプの視聴者にとっては苦手なんだろうと思うが、自分はそういうところが寧ろ好きだ。その方が自然だし共感できる。
すれ違いの表現が上手い
目の前の登場人物と会話をしているのに心では別の人のことを思い出しているシーンがあったり、或いは、瞳の中に人物を描いて”今、誰のことを考えているのか?”を視聴者に明示したり、特に主人公が描く絵本が2種類のうち今どっちなのか?など感情の表現の仕方が多様だ。
会話のテンポが良い
最終話に「不服か?」という印象的なセリフがある。説明的でなくややハイコンテクストなのだが、適格な心理描写だった。ところどころ、説明的なセリフを思い切ってすっ飛ばしているところがあり、印象深いセリフになっている。
音について
自分は音楽に詳しくない。しかしここぞという場面の切り替わりで緊張感のある音が入ったり、ヒロインに変な歌を歌わせてそれを効果的に使ったり、多分、効果音や劇伴の使い方はかなりよく練られているのだと思う。
感想
13話が驚く程に平坦な感じで進むのに、感情はキッチリ揺さぶられる。主人公もヒロイン達も他の登場人物も開始から終了までにほんのちょっとしか成長しないし、何か大きな事件が解決して大団円になるわけでもないし、終わりも全くハッピーエンドではなく、これからの課題山積といったところで終わる。にも関わらず、一つの物語として仕上がっているし、どうしてこんなに完成度が高くなるのか、もはやよくわからないが、制作関係者がしっかり連携して出来上がっていることが大切なのではないかと感じた。
Pythonでランダムにグラデーションを作成する
Pythonでグラデーションを作る方法とランダムに整数を発生する方法は、いずれもこのサイトを参照
グラデーション画像の作成
参照ページの通り。解像度の縦横分の行列を、3色混合分3枚作るイメージ。
import numpy as np
def get_gradient_2d(start,stop,width,height,is_horizontal): if is_horizontal: return np.tile(np.linspace(start,stop,width),(height,1)) else: return np.tile(np.linspace(start,stop,height),(width,1)).T
def get_gradient_3d(width,height,start_list,stop_list,is_horizontal_list): result = np.zeros((height,width,len(start_list)),dtype=np.float) for i,(start,stop,is_horizontal) in enumerate(zip(start_list,stop_list,is_horizontal_list)): result[:,:,i] = get_gradient_2d(start,stop,width,height,is_horizontal) return result
from PIL import Image
作例の通りモノクロなら以下
array = get_gradient_3d(1920,1080,(0,0,0),(255,255,255),(True,True,True)) Image.fromarray(np.uint8(array)).save("gradient_gray.png",quality=95)
赤から白のグラデーションにしたければ、スタートのRGBのRを高くすれば良い
array = get_gradient_3d(1920,1080,(255,0,0),(255,255,255),(True,True,True)) Image.fromarray(np.uint8(array)).save("gradient_red.png",quality=95)
よくある感じのグラデーションにするなら、比較的近い色から近い色への変化にする
array = get_gradient_3d(1920,1080,(210,40,40),(240,40,40),(True,True,True)) Image.fromarray(np.uint8(array)).save("gradient_red_light.png",quality=95)
ランダムなグラデーション
RGBの値をランダムに与えれば、ランダムなグラデーションになる。 乱数は、random関数のrandintを使えばいい。
import random
R_start = random.randint(0,255) G_start = random.randint(0,255) B_start = random.randint(0,255) R_end = random.randint(0,255) G_end = random.randint(0,255) B_end = random.randint(0,255)
1色だけ鉛直方向のグラデーションに変えるとより複雑なグラデーションになる
array = get_gradient_3d(1920,1080,(R_start,G_start,B_start),(R_end,G_end,B_end),(True,False,True)) Image.fromarray(np.uint8(array)).save("gradient.png",quality=95)
気に入った色が出たときの値をメモしておけば良い。但しどの色の縦横を変えたかも残しておく必要がある。
print(R_start,G_start,B_start,R_end,G_end,B_end)
223 60 103 146 12 38
映画『閃光のハサウェイ』は主人公の感情にフォーカスした興味深い作品
映画『閃光のハサウェイ』の完成度が高いという噂を聞いて鑑賞してきた。
因みに自分は原作小説を見ていないので、三部作がこの先どうなるのかは知らない。あくまで第一部について感じた所感だ。
ガンダムらしくないガンダムの描写
何を以て「ガンダムらしい」とするかは異論があると思うが、自分はガンダムの中心にはいつも以下の描写があると思っている
- 主人公或いは語り手が偶然から戦争に巻き込まれる(→ 自然に設定を受け入れられる)
- ガンダムを所有する組織が孤立し居場所がなくなる(→ 応援したくなる)
- 政治的な主義主張が敵味方両方にある(→世界観が壮大な印象になる)
- 自分勝手でダメな主人公が少し成長する(→ 王道)
- 登場人物が感情的な激論を交わす(*富野由悠季作品に多い少し噛み合わない喧嘩腰の会話)
だが、本作ではそれらが殆どない。特に政治的な主義主張に至っては、何のために誰と誰が戦っているのかが殆ど説明されないし、動機は最後まで不明のままだ。
主人公の葛藤や心の揺れ動きに描写が注力されている
一方で本作は、組織同士の対立の描写がない代わりに、以下のようなに個人にフォーカスした心情の描写が厚い。
- 運悪く出会った人たちに主人公が興味を持つ描写がある
- (同様に)出会った人たちや仲間の主人公に対する興味関心や感情の訴えを匂わす描写がある
- 主人公が自分の精神的な迷いと悩む台詞がある
- 戦闘シーンより日常シーンが長い
- 冒頭を除いて説明的な台詞が少なく暗喩的で推測させる描写が多い(小物にフォーカスしたシーンが多数インサートされる)
- 主人公の主観でブレたりボケたりする映像のインサートがある
今までのガンダムとはフォーカスするポイントが異なるが、自分は寧ろこういった個人の感情に注力した描写がある方が人間味があって好きだし、バランスも良いと思う。
独特のMS戦闘シーン
これはガンダムシリーズが好きな人には好き嫌いが出そうなポイントだと思ったが、
といった、これまでのガンダムシリーズが凝っていた戦闘シーンの描写はあまりない。 一方で、
- 銃声の音響が強く重い
- ビームだけが光る緊張感のあるシーン
- 無重力空間の恐ろしさの演出
- 市街戦で消火栓が溶ける、天井から落下物がある、など細かい描写で恐怖を煽る
など、今までとは違った形で、戦闘シーンに「重さ」を見せてくる。
巨大なロボットが戦う描写や、派手に建物が壊れる様子や、逃げ惑う人の悲鳴などのこれまでのステレオタイプな描写とはまた違った見せ方だと感じた。
『逆襲のシェア』は見ておいた方がいい
ストーリーを理解するためというより、主人公の葛藤を追いかけるには、主人公の「ハサウェイ」がどんな”ダメ少年”だったかを知っている方が感情移入できる。
少し情緒不安定なヒロインに再び翻弄されるハサウェイ君が少し成長しつつも憎めないところがあり、泣けてくるのだ。
大きなスクリーンと良い音響のスクリーンがあてがわれているうちに見たい作品だ。
*1:公式の予告1,2がネタバレをしているのでこの特報映像をお勧めする
Jupyter notebookでvpythonを表示させるにはcanvas()が必要
読んでいる本でvpython (visual python)のライブラリを使うところが出てきたが、何故か表示されなず困っていた。
迷っていると同じ悩みがstack overflow にあったので、リンクをメモしておく。
Jupyter nobebookを使っている場合は、
canvas()
が必要なようだ。
有名な球体の表示だとこうなる
from vpython import *
canvas() sphere()