LoginSignup
6
6

はじめに

こんにちは。
オークファン開発部デザイナーの@af_etoです。

Adobe Creative Cloudの通知で、Substance 3Dに触れたきっかけで、
3DCG制作に取り組んでみることにしました。

基礎的な3DCG制作を習得しておけば、
簡単なものは少しの手間で作れて便利かもしれません。
デザインの選択肢が増えるならば、表現の幅も広がるかも!?

シンプルなイメージ画像を作ってみる

架空のコーポレートサイトのデザインを元に考えようと思います。

例えば、下の画像のようなページの余白(薄いグレー部)に、
ロゴマークが3Dになったものをさり気なく敷いて、
少し工夫したコーポレートアイデンティティみを出してみたいと思います。

jizn_corp.png

ロゴマークをぼんやり設置してみてもいいですね。

jizn_corp_easy.png

ニューモーフィズム感出してみたり。
背景画像だけで印象が大きく変わりますね。

jizn_corp_neumorphism.png

これで雰囲気は充分な気もしますが、
試しに3Dロゴマーク画像を作成して設置してみましょう。

Blenderを利用する

どうやらAdobeのSubstance3Dは有料らしいので...、
無料で使えるオープンソースの3DCGソフト『Blender』を使います。
まずはダウンロード&インストールします。

Blenderの初期設定

Blenderを起動すると立方体が置いてあり、よく見るとカメラと照明っぽいものもあります。
初期設定として配置されているようです。
英語表示になっているので、上部メニューのEdit > PreferenceからInterface > languageを「日本語」に変更します。

Blender初期表示.png

マウスホイールを回したり、マウスホイールの中心を押して画面をグリグリすると、視点が動きます。
操作は環境によって違いがあるかもしれません。

画面右上の「XYZ」を押すと視点がそれぞれの軸に移動し、テンキーでも視点を変えられるようです。
使い方が分からな過ぎて、しばらく適当に触ってましたが、
XYZという方向感覚をまず身に付けると、操作がスムーズになりそうです。

Blender初期表示Z.png

「Z」真上からの視点です。
カメラと照明の位置関係もわかります。

初期設定でのレンダリング

この初期状態で、カメラに写っている映像をプレビューしてみましょう。
上部メニューのレンダー > 画像をレンダリングしてみると、

Blender初期レンダリング.png

およそ想像通りの画像が表示されました。
「物体を作成し、カット・構図を決めてライティング、カメラで撮る」のような手順で進めればよさそうですね。

SVGデータの読み込み

SVGデータを読み込めるようなので、複雑なロゴマークも簡単に立体化できそうです。
上部メニューのファイル > インポートで読み込むSVGファイルを選択すると、

SVG読み込み.png

ペラっと配置されます。
それを右の操作パネルオブジェクトプロパティでX軸で90度回転させて起こします。

SVG回転X.png

さらにtabキーで編集モードに変更して、を選択して押し出します。

SVG押出しと色.png

立体ロゴマークができました!
さらにSVGから引き継がれた黒は不要なので、
右操作パネルマテリアルプロパティから「SVGMat」を削除して、ベースカラーを白にしました。

tabキーで編集モードに変更して、を選択して

と、ざっくり書きましたが、
オブジェクトモードではオブジェクトそのものを選択でき、編集モードではオブジェクトの頂点、辺、面を選択することができます。
オブジェクトを選択してtabキーを押すか、左上のモード設定のセレクトボックスで切り替えが可能です。

ロゴマークの立体化にあたっては、ロゴマークを編集モードにしてを選択、
右クリックメニューの面を押出しで立体化しました。

背景を設置する

立体ロゴの影を落として、さらに立体感出したいので、背景を置いてみます。
Shift+Aを押すと新規でオブジェクト、カメラや照明を設置することができます。
メッシュ > 平面を追加して、角度や位置を調整します。

SVGに背景設置.png

さらに、照明を正面斜めから照らして、カメラも反対の正面斜めから構えます。
下の図はそのセッティングを真上から見たものになります。

何となくセッティング.png

そこでレンダリングしてみます。

何となくレンダリング.png

立体ロゴにフォーカスしてませんでした。背景の切れ目も見えてしまってます。
少し上から捉え過ぎているかもしれません。

再セッティング

初期設定のカメラの調整が難しかったので、
Shift+Aで正面に向けた新規カメラを追加します。
水平を保ちながら、角度を変えて、

新規カメラ配置.png

背景も切れないようにサイズを変更してレンダリングすると、

新規カメラ配置レンダリング.png

ちょっといい感じになりました。
立体ロゴと背景をもう少し近づけて、もっと明るくして..といった具合に、
自分のイメージに近づくようカメラや照明を調整していきます。

照明調節.png

照明を強めで、カメラは少し遠目から狙って、

カメラ調節.png

画角も調整して、

レンダーエンジン変更.png

レンダリングすると、

それっぽくなった.png

なんとか背景画像に使えるかもしれない。
細部の追求は後にして、ひとまずこれで完成とします。
レンダリング画像のウィンドウの上部メニュー画像 > 名前を付けて保存し、
明るさ、コントラストを調整して、先程のページタイトル背景に敷いてみます。

背景画像の完成

jizn_corp_3d.png

うーん...。はじめてなので、これで良しとしましょう!

3DデータをWEBページで動かす

「Blender」でGoogle検索していると、three.jsを使って
3DデータをWEBページに表示する記事を多く見かけます。
頑張ればできそうなのでやってみましょう。

動作を決める

再び架空のサービスサイトのデザインを元に考えようと思います。

下の画像のようなページ構成のスマートフォンを3Dデータにして、
マウスの動きに合わせてユラユラ動かしてみます。

jizn_static.png

2D画像から3Dモデルを作成する

Blenderでスマートフォンを作成するのですが、
まずはガイドとなるスマートフォンを2Dで作成し、Blenderに読み込みます。

2D画像読み込み.png

Shift+Aメッシュ > 立方体を追加して、形状を合わせていきます。
角に丸みを付けたい場合は編集モード > 辺で丸みをつけたい辺を選択し、control+Bで角を取れます。

角をとる.png

押し出しでスピーカー部のへこみを作ります。

スピーカー部押し出し.png

ボタンを取り付けて、

ボタン取り付け.png

色をつけて、

色をつける.png

ページのキャプチャをスクリーン画面に設定します。

スクリーン貼り付け.png

工程の詳細をだいぶ省略してますが、操作にさえ慣れれば、割と手軽に作れます。

セッティング.png

カメラや照明を調整してる風ですが、かなり暗中模索です...。
やればやるほど遠ざかっていくような気がしているので、
きちんと基礎から学習しなければならないなと痛感しています。

何となく完成.png

ひとまずスマートフォンの3Dデータは完成しました。

上部メニューのファイル > エクスポート > glTF 2.0 (.glb/gltf)から
3Dデータを「glTFファイル」の形式でエクスポートして準備完了です。

three.jsのダウンロード

Github、または公式からThree.jsのライブラリ一式をダウンロードします。

three.jsのライブラリを読み込む

必要なjsファイルを任意のフォルダにコピーします。

index.html
<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要素を用意します。

index.html
<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/

完成.gif

おわりに

スマートフォンの3Dモデル作成の際に、照明設定が上手にできず、Blenderの照明は利用しませんでした。
やはり、マテリアル、照明、カメラの設定を基礎から学習する必要がありそうです。
そのうち3D動画制作もやってみたいと思います。

参考記事

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6