BlenderでOBJファイルを使う(その2)

Planeオブジェクトをさらに細かく分割して、文字を浮かばせてみます。

準備するもの
  • Linux PC(確認環境はDebian 8.3 Jessie)
  • 端末ウィンドウ(ターミナルソフト)
  • Blender(確認環境はv2.72)

最初にsubdivideで20分割したPlaneをOBJファイルで保存します。

takk@deb83:~$ cat -n bl-export-obj20.sh
     1	#!/bin/bash
     2	cat <<EOL>/tmp/tmp.py
     3	
     4	import bpy
     5	
     6	bpy.ops.object.delete()
     7	
     8	bpy.ops.mesh.primitive_plane_add()
     9	bpy.ops.transform.resize(value=(21,21,1))
    10	bpy.ops.object.mode_set(mode='EDIT')
    11	bpy.ops.mesh.subdivide(number_cuts=20)
    12	
    13	bpy.ops.export_scene.obj(filepath='wavefront.obj')
    14	
    15	EOL
    16	blender -P /tmp/tmp.py
takk@deb83:~$ . bl-export-obj20.sh

このような内容のOBJファイルが生成されます。

takk@deb83:~$ cat wavefront.obj
# Blender v2.72 (sub 0) OBJ File: ''
# www.blender.org
mtllib wavefront.mtl
o Plane
v -21.000000 0.000000 21.000000
v 21.000000 0.000000 21.000000
v -21.000000 0.000000 -21.000000
v 21.000000 0.000000 -21.000000
v -21.000000 0.000000 -19.000000
v -21.000000 0.000000 -17.000000
v -21.000000 0.000000 -15.000000
v -21.000000 0.000000 -13.000000
v -21.000000 0.000000 -11.000001
v -21.000000 0.000000 -9.000001
v -21.000000 0.000000 -7.000001
v -21.000000 0.000000 -5.000000
v -21.000000 0.000000 -3.000000
v -21.000000 0.000000 -1.000000
v -21.000000 0.000000 1.000000
v -21.000000 0.000000 3.000000
v -21.000000 0.000000 5.000000
v -21.000000 0.000000 7.000000
v -21.000000 0.000000 8.999999
v -21.000000 0.000000 10.999999
v -21.000000 0.000000 12.999999

(省略)

小数点以下の数字が扱いにくいので丸めます。

takk@deb83:~$ perl -pe 's/([\.\d]+)/int($1+0.5)/ge if/^v/' -i wavefront.obj

bannerコマンドを使って盛り上がらせる座標を算出するスクリプトを作成して、

takk@deb83:~$ cat bl-obj-banner.sh
     1	open(BANNER,"banner $ARGV[0] |");
     2	$y=0;
     3	while(<BANNER>){
     4		print;
     5		$x=0;
     6		foreach(split //,$_){
     7			if(/#/){
     8			$x1=$x*6+2-21;
     9			$x2=$x*6+4-21;
    10			$y1=$y*6+2-21;
    11			$y2=$y*6+4-21;
    12			push @banner,"$x1 0 $y1";
    13			push @banner,"$x1 0 $y2";
    14			push @banner,"$x2 0 $y1";
    15			push @banner,"$x2 0 $y2";
    16			}
    17			$x++;
    18		}
    19		$y++;
    20	}
    21	close(BANNER);
    22	
    23	while(<STDIN>){
    24		$line =$_;
    25		foreach $xy (@banner){
    26			if($line =~ /^v $xy$/){
    27				$line =~ s/(\-?)(\d+) 0/$1$2 4/;
    28			}
    29		}
    30		print $line;
    31	}

実行します。

cat wavefront.obj | perl bl-obj-banner.pl 5 > aa.obj

実行したOBJをインポートすると、引数で指定した一文字が浮かび上がってきます。
bl-obj16-005

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA