「Sci-Fiな通路」制作記録

はじめに

3Dモデリングとお絵かきをしたのでその過程を残します。

255

Houdiniで背景のモデリング

背景はHoudiniでモデリングしました。

最初にGeometryノードを作成し、ダブルクリックかiキーでネットワーク内部に入ります。

0

Gridノードを作成します。

1

2

Orientationを「YZ Plane」に、Sizeをそれぞれ「6」「3」に、 RowsとColumnsを「2」にします。

3

Scatterノードを接続します。

4

Force Total Countのチェックを外します。 点の数ではなく密度で指定するようになります。

5

6

Point Wrangleをつなぎます。

7

次のようにVEXを書きます。

8

これで点が格子点上に配置されます。 スライダはそれぞれの軸の格子の大きさを決めています。

fuseをつないで重複した頂点を削除します。

10

Keep Unused Pointsにチェックを入れます。 これで面や辺を構成していない点が保持されます。

11

もう一つPoint Wrangleをつなぎます。

12

次のVEXを書きます。

13

ランダムに頂点を削除するプログラムになります。

14

Voronoi Fractureノードをつなぎます。

15

16

Scatterから直接ボロノイ分割した場合と比べると、 より整列した印象になっていることがわかります。

17

18

この量子化した点をボロノイに渡すというのは次の動画を参考にしました。

Procedural Hard Surface Design | Akira Saito | SIGGRAPH Asia 2018 (Tokyo) on Vimeo

この動画には他にもボロノイの実践的なテクニックが紹介されているのでおすすめです。

nullノードを作成します。

19

Zキーからnullノードの形を変更します。

20

21

Cキーからnullノードの色を変更します。

22

23

右上のギアマークから「Edit Parameter Interface」を選びます。

24

Floatをドラッグアンドドロップして追加します。

25

ラベルを「Seed」と名付けます。

26

nullに新しく追加された「Seed」を右クリックから「Copy Parameter」します。

27

Scatterの「Global Seed」と、頂点を削除しているPoint WrangleのSeedに 「Paste Relative References」します。

28

29

これでnullノードでSeedをコントロールできるようになりました。

30

同様にして各Quantizationの値と頂点削除のしきい値をnullノードでコントロールするようにします。

32

33

34

しきい値のRangeを0から1までに変更します。

35

最初からあるパラメータは使わないので隠します。

36

nullノードにコントロールするパラメータが集約されてわかりやすくなりました。

37

これまでのノードを全部選択してShift-Cでサブネットに格納します。

38

39

右クリックから「Create Digital Asset」を選択します。

40

デジタルアセットの名前を適当につけます。

41

Type Parameterの画面が自動で開きます。

42

平面のOrientationとSizeをドラッグ・アンド・ドロップします。

43

nullノードに集約したパラメータをドラッグ・アンド・ドロップします。

44

45

ToolsのContextから追加するタブメニューを指定します。 こんかいは「Digital Assets/Sci-Fi」としました。

46

これでこのノードがタブメニューから作成できるようになりました。

47

作成したノードは一つのノードのように扱われ、パラメータを自由にいじれます。

48

49

すでに作成してあるノードを右クリックから「Match Current Definition」でロックします。

50

51

For-Each Primitiveループを追加します。

52

53

「Create Meta Import Node」を追加します。 このノードのiterationを利用します。

54

55

Poly Extrudeノードをfor-eachループ内に追加します。

56

Distanceに「rand(detail("../foreach_begin1_metadata1/", "iteration", 0))」と記述します。 イテレーション回数をシードとしてランダムに押し出ししています。

57

Front Groupを有効にし、Output Backも有効にします。

58

poly bevelをつなぎます。

59

extrudeFrontに対してわずかにベベルをつけます。

60

normalノードをつないでBy Face Areaを指定します。

61

62

これで次のようなものができます。

63

新しく先ほど作成したデジタルアセットを作成します。

64

次のようにノードを組みます。

65

次のようなものが作られます。

66

一つずつパラメータを解説していきます。

最初にprimitive wrangleを追加します。

67

次のようなVEXを記述します。 ランダムにプリミティブを削除するプログラムになります。

68

次にforeach primitiveを追加します。 メタデータも作成しておきます。

69

70

foreachの内部では最初にpoly extrudeをつなぎます。

71

Distanceで少しだけ押し出しをして、extrudeFrontグループを作成し、 Output Backを有効にします。

72

polyextrudeのあとは2つに分岐しています。 右側から見ていきます。

右側はpoly bevelにつないでいるだけです。

73

わずかにベベルを与えました。

74

分岐の左側を見ていきます。

BlastノードでextrudeFrontグループ以外を削除しています。

75

76

77

その後、Convert Lineノードを接続します。

78

79

その後foreach primitiveループを作成します。 これで作成されたエッジごとにループが回るようになります。

80

81

resampleノードを接続します。

82

83

poly frameでtangentをNとして出力します。

84

85

これで線の方向に沿ってNが作られました。 copy to pointでこの法線が重要になります。

86

つぎにpoint wrangleを接続します。

87

次のVEXを書きます。 最初と最後の要素を削除し、指定された個数以上の点を削除しています。 「@ptnum == @numpt」ではなくて「@ptnum == @numpt - 1」が正しそうな気がします。

88

これで最初の方の3つの点が残りました。

89

この点に対してcopytopointします。

コピーされる物体の方を見ていきます。 最初にTubeを作成します。

90

End Capsを有効にして大きさを適当に小さくします。

91

Group Createノードを接続します。

92

上半分の領域を選択します。

93

94

transformで作成したグループを上方向に移動します。

95

96

97

次のtransformで全体を下に下げて中心を合わせます。

98

99

100

さらにtransformで縮小しました。

101

102

103

ノードをcopytopointsに接続します。

104

各ラインに3つ複製されるようになりました。

105

106

107

複製したものをbooleanで引き抜きます。 booleanノードに接続します。

108

SubtractでB-Aに設定します。 右側から左側のジオメトリを引きます。

109

transformノードを接続して各パネルを微妙にずらします。

110

Translateのxに「rand(detail("../foreach_begin2_metadata1", "iteration", 0)) * 0.2」と書きました。

111

これでforループの内部は終わりです。

112

113

最後にnormalノードを接続しBy Face Areaに変更します。

114

115

116

長くなったのでsubnetに格納します。

117

118

transformでx軸方向に少しだけ動かします。

119

120

mergeノードで作成した2つをマージします。

121

次のようになりました。

122

123

新しくノードを右側に作成してmergeに追加します。

124

一つずつノードのパラメータを見ていきます。

最初にGridノードを作成しています。

125

グリッドのサイズをこれまでのと合わせました。

126

127

次にSubdivideノードを接続してきとうに分割します。

128

その次にFind Shortest Pathノードを接続します。

129

Start Pointsとして右側の頂点を選択します。

131

130

End Pointsとして左側の頂点を選択します。

133

132

From each start to each endにします。

134

Omit Distance from Costにします。

135

これで次のようなラインが作られました。

136

poly wireとnormalノードを接続し、transformで適当な位置に移動します。

137

138

mergeノードに組み合わせます。

139

これで次のようになりました。

140

最初のグリッドのサイズを少し大きくしました。

141

ここからSubstance Painter用のIDマップを作成していきます。

Colorノードを接続して適当な色を与えていきます。

142

143

144

145

146

147

前面のパネルには2色で塗り分けをしたいのでサブネットの内部で色を与えます。

148

primitive wrangleとattribute promoteをforループの前に追加しました。

149

150

追加したprimitive wrangleには次のようなVEXを記述します。 プリミティブごとにランダムに2色に塗り分けています。

151

attribute promoteノードを接続します。

152

Cdをprimitiveからpointに移動します。

153

これで次のように塗り分けられました。

154

マージの仕方を変えて右側と左側の両方にuv unwrapとuv flattenノードを接続します。

155

156

157

Game ToolsのSimple Bakerノードを接続します。

158

適当に名前を変更しました。 normalとaoもベイクしましたが、basecolorしか使いません。

159

右側でも同様にベイクします。

160

162

オブジェクト階層に行くとなぜか表示が白黒になってしまいましたが 原因不明なので気にせず作業を進めます。

163

164

作成した壁を複製してサイズやシードを変えて配置します。

165

166

それぞれでベイクを行います。 なんか色がバグっていますがデータは問題なく作成されているようなのでそのまま進めます。

167

次にケーブルを作成していきます。 新しいGeometryノードを用意します。

168

curveを作成します。

169

170

poly frameでNormalをup、tangentをNとします。

171

172

lineを作成し、Directionを1, 0, 0にします。

173

lengthをコピーしてOriginのxにペーストし、「-」と「/2」を加えます。

174

175

pointsを適当に増やします。

176

Copy Stampノードに接続します。

177

Stamp Inputsを有効にして$PTを用意します。

178

コントローラ用のnullを作成します。

179

180

右上のギアからEdit Parameter Interfaceを開きます。

181

最初からあるパラメータは必要ないので隠します。

182

Floatをドラッグ・アンド・ドロップしてSeedと名付けます。

183

184

nullノードにSeedが追加されました。

185

lineノードにsortノードをつなげます。

186

Point SortをRandomにして、Seedに「stamp("../copy1/", "p", 0) + ch("../null1/parm")」と記述します。 コピーしたポイント番号とnullのSeedを足し合わせたものをランダムのシードとして使います。

187

コピーされたラインの頂点がランダムになっていることがわかります。

188

point jitterをつなげます。

189

scaleを小さくして、seedには先程と同様のものを記述します。

190

コピーされたラインが少しがたがたになりました。

191

point wrangleを追加します。

192

次のVEXを記述します。 ポイント番号を文字列にして@nameアトリビュートに追加しています。

193

copy stampの下にaddノードを接続します。

194

Delete Geometry But Keep the Pointsを有効にします。 これで頂点のみが残ります。

195

foreachループを接続します。

196

Piece ElementsをPointsに、Piece Attributeをnameにします。 これでnameが等しいものはまとめられてループが回るようになります。

197

ループの中でAddノードを作成します。

198

PolygonのBy GroupでAll pointsにします。 これでランダムにソートされたlineの頂点番号が等しい者同士が繋がります。

199

resampleノードを接続します。

200

201

restノードを接続します。

202

for feedbackループを接続します。

203

iterationsを32にします。

204

detangleノードを接続します。

205

Previous Positionをrestにします。

206

このdetangleのつなぎ方は次の動画を参考にしました。

Houdini 17 is here! Vellum quickstart pt 4 5 The Detangle SOP - YouTube

コントローラ用のnullにパラメータを追加します。

207

208

Cable Radiusという名前にしました。

209

Cable Radiusをコピーします。

210

DetangleのDefault ThicknessにPaste Relative Referencesします。

211

212

Rangeを適切に調節します。

213

214

ここまでで次のようになりました。

215

216

ちょっとガチャガチャしすぎているのでResampleのLengthを少し長くしました。

217

次のようになります。

218

Subdivideをつないでなめらかにします。

219

220

polywireをつなぎます。

221

Wire RadiusにCable Raduisをペーストします。

222

次のようになります。

223

コントローラのnullにパラメータを増やします。 JitterのスケールとLineのポイントの一人長さをパラメータにしました。

224

225

226

カーブを除いて全部のノードを選択します。

227

サブネットにまとめます。

228

Create Digital Assetします。

229

適当な名前をつけます。

230

nullに集めておいたパラメータを全部ドラッグ・アンド・ドロップします。

231

232

Input/Outpuからinputのラベルを適当にに変更します。 ここでは「User Curve」としました。

233

ToolsのContextから「Digital Assets/Sci-Fi」としました。

234

作成したケーブルを配置していきます。

235

236

237

IDマップ用に色を与えます。

238

239

uv unwrapとuv flattenを接続してSimple BakerでIDマップを焼きます。

240

以上で次のようになりました。

241

242

fbxの書き出しを行います。

243

244

Substance Painterでマテリアルを割り当てる

書き出したfbxをSubstance Painterに持ち込みます。

245

246

作成したidマップを適切に与えます。 作業が面倒だったのでSubstance Painter側でidマップもベイクしたほうが楽そうです……。 次回からはそのように作業することにします。

247

適当にマテリアルを割り当てました。

248

BlenderのCyclesでレンダリングをする

Blenderにfbxを読み込ませると、 マテリアルに黒色が指定されていたようで真っ黒になります。

249

MatCapで描画するときちんと描画されます。

250

レンダラをCyclesに変更し、 Substance Painterから書き出したテクスチャをPrincipled BSDFノードにつなぎます。

251

Emissionを割り当てた光源を適当に配置します。

252

レンダリングした結果はこのようになりました。

253

以前作成したキャラクターのモデルを 読み込んで配置しました。

254

Kritaで加筆する

レンダリング結果をKritaに読み込んで加筆しました。

255

おわりに

Houdiniでのモデリング部分についてだいぶ丁寧に書きました。 とても大変だったので今後はこんなに丁寧に書くことはないと思います……。

古い投稿
Sci-Fiな通路