はじめに
こんにちは。
オークファン開発部デザイナーの@af_etoです。
Adobe Creative Cloudの通知で、Substance 3Dに触れたきっかけで、
3DCG制作に取り組んでみることにしました。
基礎的な3DCG制作を習得しておけば、
簡単なものは少しの手間で作れて便利かもしれません。
デザインの選択肢が増えるならば、表現の幅も広がるかも!?
シンプルなイメージ画像を作ってみる
架空のコーポレートサイトのデザインを元に考えようと思います。
例えば、下の画像のようなページの余白(薄いグレー部)に、
ロゴマークが3Dになったものをさり気なく敷いて、
少し工夫したコーポレートアイデンティティみを出してみたいと思います。
ロゴマークをぼんやり設置してみてもいいですね。
ニューモーフィズム感出してみたり。
背景画像だけで印象が大きく変わりますね。
これで雰囲気は充分な気もしますが、
試しに3Dロゴマーク画像を作成して設置してみましょう。
Blenderを利用する
どうやらAdobeのSubstance3Dは有料らしいので...、
無料で使えるオープンソースの3DCGソフト『Blender』を使います。
まずはダウンロード&インストールします。
Blenderの初期設定
Blenderを起動すると立方体が置いてあり、よく見るとカメラと照明っぽいものもあります。
初期設定として配置されているようです。
英語表示になっているので、上部メニューのEdit > Preference
からInterface > language
を「日本語」に変更します。
マウスホイールを回したり、マウスホイールの中心を押して画面をグリグリすると、視点が動きます。
操作は環境によって違いがあるかもしれません。
画面右上の「XYZ」を押すと視点がそれぞれの軸に移動し、テンキーでも視点を変えられるようです。
使い方が分からな過ぎて、しばらく適当に触ってましたが、
XYZという方向感覚をまず身に付けると、操作がスムーズになりそうです。
「Z」真上からの視点です。
カメラと照明の位置関係もわかります。
初期設定でのレンダリング
この初期状態で、カメラに写っている映像をプレビューしてみましょう。
上部メニューのレンダー > 画像をレンダリング
してみると、
およそ想像通りの画像が表示されました。
「物体を作成し、カット・構図を決めてライティング、カメラで撮る」のような手順で進めればよさそうですね。
SVGデータの読み込み
SVGデータを読み込めるようなので、複雑なロゴマークも簡単に立体化できそうです。
上部メニューのファイル > インポート
で読み込むSVGファイルを選択すると、
ペラっと配置されます。
それを右の操作パネルオブジェクトプロパティ
でX軸で90度回転させて起こします。
さらにtab
キーで編集モード
に変更して、面
を選択して押し出します。
立体ロゴマークができました!
さらにSVGから引き継がれた黒は不要なので、
右操作パネルマテリアルプロパティ
から「SVGMat」を削除して、ベースカラーを白にしました。
tab
キーで編集モード
に変更して、面
を選択して
と、ざっくり書きましたが、
オブジェクトモード
ではオブジェクトそのものを選択でき、編集モード
ではオブジェクトの頂点、辺、面
を選択することができます。
オブジェクトを選択してtab
キーを押すか、左上のモード設定のセレクトボックスで切り替えが可能です。
ロゴマークの立体化にあたっては、ロゴマークを編集モード
にして面
を選択、
右クリックメニューの面を押出し
で立体化しました。
背景を設置する
立体ロゴの影を落として、さらに立体感出したいので、背景を置いてみます。
Shift+A
を押すと新規でオブジェクト、カメラや照明を設置することができます。
メッシュ > 平面
を追加して、角度や位置を調整します。
さらに、照明を正面斜めから照らして、カメラも反対の正面斜めから構えます。
下の図はそのセッティングを真上から見たものになります。
そこでレンダリングしてみます。
立体ロゴにフォーカスしてませんでした。背景の切れ目も見えてしまってます。
少し上から捉え過ぎているかもしれません。
再セッティング
初期設定のカメラの調整が難しかったので、
Shift+A
で正面に向けた新規カメラを追加します。
水平を保ちながら、角度を変えて、
背景も切れないようにサイズを変更してレンダリングすると、
ちょっといい感じになりました。
立体ロゴと背景をもう少し近づけて、もっと明るくして..といった具合に、
自分のイメージに近づくようカメラや照明を調整していきます。
照明を強めで、カメラは少し遠目から狙って、
画角も調整して、
レンダリングすると、
なんとか背景画像に使えるかもしれない。
細部の追求は後にして、ひとまずこれで完成とします。
レンダリング画像のウィンドウの上部メニュー画像 > 名前を付けて保存
し、
明るさ、コントラストを調整して、先程のページタイトル背景に敷いてみます。
背景画像の完成
うーん...。はじめてなので、これで良しとしましょう!
3DデータをWEBページで動かす
「Blender」でGoogle検索していると、three.jsを使って
3DデータをWEBページに表示する記事を多く見かけます。
頑張ればできそうなのでやってみましょう。
動作を決める
再び架空のサービスサイトのデザインを元に考えようと思います。
下の画像のようなページ構成のスマートフォンを3Dデータにして、
マウスの動きに合わせてユラユラ動かしてみます。
2D画像から3Dモデルを作成する
Blenderでスマートフォンを作成するのですが、
まずはガイドとなるスマートフォンを2Dで作成し、Blenderに読み込みます。
Shift+A
でメッシュ > 立方体
を追加して、形状を合わせていきます。
角に丸みを付けたい場合は編集モード > 辺
で丸みをつけたい辺を選択し、control+B
で角を取れます。
押し出し
でスピーカー部のへこみを作ります。
ボタンを取り付けて、
色をつけて、
ページのキャプチャをスクリーン画面に設定します。
工程の詳細をだいぶ省略してますが、操作にさえ慣れれば、割と手軽に作れます。
カメラや照明を調整してる風ですが、かなり暗中模索です...。
やればやるほど遠ざかっていくような気がしているので、
きちんと基礎から学習しなければならないなと痛感しています。
ひとまずスマートフォンの3Dデータは完成しました。
上部メニューのファイル > エクスポート > glTF 2.0 (.glb/gltf)
から
3Dデータを「glTFファイル」の形式でエクスポートして準備完了です。
three.jsのダウンロード
Github、または公式からThree.jsのライブラリ一式をダウンロードします。
three.jsのライブラリを読み込む
必要なjsファイルを任意のフォルダにコピーします。
<script src="/assets/js/threejs/three.min.js"></script>
<script src="/assets/js/threejs/OrbitControls.js"></script><!-- カメラ制御 -->
<script src="/assets/js/threejs/RoomEnvironment.js"></script><!-- 環境光制御 -->
<script src="/assets/js/threejs/GLTFLoader.js"></script><!-- glTFの読み込み -->
<script src="/assets/js/index.js"></script>
HTML
描画エリアとなるcanvas要素を用意します。
<div id="canvasBox"><canvas id="canvas"></canvas></div>
3D表示用のJavaScriptを用意
レンダラー作成(画面描画)
const renderer = new THREE.WebGLRenderer({
// 出力するcanvas要素
canvas: document.querySelector('#canvas')
});
canvas設定
// canvas親要素
const container = document.getElementById('canvasBox');
// ウィンドウサイズ設定
let windowW = window.innerWidth;
let windowH = window.innerHeight;
// canvasサイズ設定
let parentW = container.clientWidth;
let parentH = container.clientHeight;
レンダラー設定
// 描画サイズ調整
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(parentW, parentH);
// 背景透過
renderer.setClearColor(0x000000, 0);
// Blenderの色をThree.jsで再現する設定
renderer.physicallyCorrectLights = true;
renderer.outputEncoding = THREE.sRGBEncoding;
// シャドウ有効
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
シーン作成
const pmremGenerator = new THREE.PMREMGenerator(renderer);
const scene = new THREE.Scene();
環境光設定
const roomEnviroment = new THREE.RoomEnvironment();
scene.environment = pmremGenerator.fromScene(roomEnviroment, 0.04).texture;
glTF/glbロード
// カメラを作成
let camera;
const loader = new THREE.GLTFLoader();
// glTFファイル
const url = 'assets/glb/smartphone.glb';
let model = null;
loader.load(
url,
function (gltf) {
model = gltf.scene;
// シーンにモデル追加
scene.add(model);
// Blenderで作成したカメラの配列
camera = gltf.cameras[0];
render();
},
undefined, function (e) {
console.log(e);
}
);
マウス座標管理用のベクトル
const mouse = new THREE.Vector2();
const windowHalf = new THREE.Vector2(
windowW / 2,
windowH / 2
);
マウスイベント
function onDocumentMouseMove( event ) {
mouse.x = (event.clientX - windowHalf.x) / windowHalf.x;
mouse.y = (event.clientY - windowHalf.y) / windowHalf.y;
scene.traverse(function(obj) {
if (obj.isMesh) {
obj.rotation.y = mouse.x / 2;
obj.rotation.x = mouse.y / 2;
}
});
}
レンダリング
function render() {
requestAnimationFrame(render);
renderer.render(scene, camera);
}
ブラウザで確認
何とか動きました。。。
ひとまず、マウスの動きに合わせて3Dデータが動いているので良しとしましょう。
https://manahub.github.io/jizn/
おわりに
スマートフォンの3Dモデル作成の際に、照明設定が上手にできず、Blenderの照明は利用しませんでした。
やはり、マテリアル、照明、カメラの設定を基礎から学習する必要がありそうです。
そのうち3D動画制作もやってみたいと思います。