TEST用のWin7のPC、
マザボがGIGABYTEのH55M-D2H
ディスクドライブ
HDD 1TB (システム予約領域:100MB C:112GB E:416GB F:402GB)
SSD 240GB
ソフトの再インストールや設定がめんどくさい & 年末で時間がもったいないので、
Win8にアップグレード後、SSDに起動ドライブを引っ越した際の作業内容のメモ
「SSDって何?」から開始したはず
【手順】
■Win8にアップグレード
CCleanerでCドライブのごみ掃除 使用領域が60GB -> 40GBに減ったはず
アップグレードアシスタントで×印の付いたソフトをアンインストールした気がする
Windows 8のディスクをDVDドライブに入れてセットアップ
特に問題無かったはず(約1時間~2時間)
■SSDへの引っ越し
SSDを、なんとかして接続
MiniTool Partition Wizard Home Edition 7.6.1を実行
システム予約領域とCドライブをSSDにコピー後に、Applyボタンを押す
再起動後の、ブート中に HDD -> SSDにコピーされた
コピー中に経過時間の表示があった、
SSDにコピーされているのを確認したらシャットダウン
HDDのSATAの接続ケーブルを外しておく
MBRを作成
Win8をDVDからブートさせて、システムの修復を選択
コマンドプロンプトを起動させて、bootrecコマンドを使用
bootrec /fixmbr
bootrec /fixboot
bootrec /ScanOs スキャン結果が出たらアップグレードしたWindowsを選択
bootrec /RebuildBcd
exit 後 PCの電源OFF
電源ON -> SSDでブートできたらOK
電源OFF HDDのSATAケーブルを接続
電源ON BIOSでHDDのブート優先順位 SSDを上にする
"Windows の修復なんとか"が 英文から日本語に切り替わった ! ?
"修復 し よ う としています" の画面が5分くらい表示されてた
Windows 8が起動したら 窓+E でハードディスクをチェック
C, E, Fドライブが表示されて、HDDのシステム予約領域とCドライブは見えなくなっていた
SSDのシステム予約領域とCドライブを最適化しておく
以上で作業終了
一番疲れたのがSATAケーブルの抜き差し
グラボを外さないと 手が・・届かない・・ ラジオペンチで解決
EaseUS Todo Backup、EaseUS Partition Masterでコピーしても、うまくいかなかった?
SSD ガリガリ音が無いので静か、アプリの起動が早くなった気がする
2012年12月16日日曜日
2012年12月8日土曜日
Android Walkman NW-F805のテスト 1
本体の裏を見ると、下側の左上にDIGITAL MEDIA PLAYERと記載されているのが
「何コレ?」
電車内でポケットに入るサイズの端末(電話嫌いなので、携帯電話はない)で、
ソースコードを無料で見るために、1週間テストした感想ですが、
(a). 本体上部の左側にある電源ボタンが押しにくい
(b). タッチパネルの反応がおかしい 「押してないよ!」
(c). なんとなく持ちにくい 片手で操作できない
(d). iPod Touch 5thより表示面積が小さいのに重い
(e). Androidに無料で、普通に使えるテキストビューアが無い?
(f). iOSでもテキストビューア無い?
(e)が問題、文字化け、50KB程度のファイルで固まる、複数ファイルを開けない・・・
使えるアプリが無い・・・
920 Text Editor が使えそうなんだけど200KBのテキストを開くと重い
https://github.com/jecelyin/920-Text-Editor にソースがあり
落として、Eclipseでビルドして動作確認 SDKなどのUpdateがめんどくさい、
JecEditText::drawView() でテキストを描画しているみたい
jniでgrep, syntax highlight, Universal Character Set Detector C Library
うーん、どうしようかなー。
(f)もあれだ、林檎教にお布施をしないとアプリが開発できない そういえば脱獄があった
あっ、XcodeするのにMac OSがいる・・・
おっ、ダクソ2が出るーーーーー
センの古城~アノールロンド突破がおもしろかった、
360のアジア版を買って連日朝までだった気がする。
「何コレ?」
電車内でポケットに入るサイズの端末(電話嫌いなので、携帯電話はない)で、
ソースコードを無料で見るために、1週間テストした感想ですが、
(a). 本体上部の左側にある電源ボタンが押しにくい
(b). タッチパネルの反応がおかしい 「押してないよ!」
(c). なんとなく持ちにくい 片手で操作できない
(d). iPod Touch 5thより表示面積が小さいのに重い
(e). Androidに無料で、普通に使えるテキストビューアが無い?
(f). iOSでもテキストビューア無い?
(e)が問題、文字化け、50KB程度のファイルで固まる、複数ファイルを開けない・・・
使えるアプリが無い・・・
920 Text Editor が使えそうなんだけど200KBのテキストを開くと重い
https://github.com/jecelyin/920-Text-Editor にソースがあり
落として、Eclipseでビルドして動作確認 SDKなどのUpdateがめんどくさい、
JecEditText::drawView() でテキストを描画しているみたい
jniでgrep, syntax highlight, Universal Character Set Detector C Library
うーん、どうしようかなー。
(f)もあれだ、林檎教にお布施をしないとアプリが開発できない そういえば脱獄があった
あっ、XcodeするのにMac OSがいる・・・
おっ、ダクソ2が出るーーーーー
センの古城~アノールロンド突破がおもしろかった、
360のアジア版を買って連日朝までだった気がする。
2012年12月2日日曜日
iPod touch 5thで動画再生のテスト
をしていたらフリーズしました。
■フリーズした場合 電源とホームボタンを同時に長押しすると再起動するはず
■PCに接続するとitunesが起動して何かするのをやめさる方法
編集/設定/デバイスから xxxのiPod touch を選択
「iPod、iPhone、およびiPadを自動的に同期しない」
それにしても薄い&軽い
■フリーズした場合 電源とホームボタンを同時に長押しすると再起動するはず
■PCに接続するとitunesが起動して何かするのをやめさる方法
編集/設定/デバイスから xxxのiPod touch を選択
「iPod、iPhone、およびiPadを自動的に同期しない」
それにしても薄い&軽い
2012年11月4日日曜日
PCL メッシュの再構築のテスト2
pcl::GreedyProjectionTriangulationのテスト
残念、欠けている部分がちらほらとある
pcl::GreedyProjectionTriangulationのテスト |
---|
|
2012年10月28日日曜日
PCL メッシュの再構築のテスト1
input cloud からポリメッシュを作成するテスト (失敗例)
入力した点群↓
実行結果が↓の画像
テスト結果 何かが変? 何だチミは?
Point Cloud Library(v1.6.0)のテスト |
---|
|
2012年9月17日月曜日
C# TextFieldParser
参照設定にMicrosoft.VisualBasicを追加
TextFieldParserのテスト |
---|
|
2012年6月24日日曜日
C++/CLI テキストの置換
main.cpp |
---|
|
2012年5月27日日曜日
MAXScript 文字列 コピー 置換
オブジェクト名に禁則文字が含まれていたので、エクスポート時に _で置換
文字列のコピーと置換のテスト |
---|
|
2012年4月30日月曜日
Bullet 衝突回数のカウント
衝突回数をカウントして、剛体を削除するテスト bullet-2.79
main.cpp |
---|
|
2012年4月29日日曜日
dcollide Kdopのテスト
K-DOP (K discrete oriented polytope)
main.cpp |
---|
|
2012年4月28日土曜日
MAXScript テキストファイルに書き出す
シーン内で使用しているテクスチャ画像の絶対パスをファイルに書き出す テスト
WriteDiffuseTexFilePath.ms |
---|
|
Win32++ (1) ボタン
main.cpp |
---|
|
2012年4月27日金曜日
OpenCV 画像の90度回転
テキストをパースして、複数の画像を1枚にまとめてみる テスト
パース処理にboostのtokenizerを使用
貼り付ける画像が、貼り付け先の画像からはみ出るとエラーになるよ
テキストファイルの例 |
---|
|
main.cpp |
---|
|
2012年4月23日月曜日
MAXScript マテリアル毎にノードをまとめる
FBXをインポートしてみたら、ノード数が多いので
sceneMaterialsを使って、マテリアル毎にまとめるテスト
MergeNodeTest.ms |
---|
|
2012年4月21日土曜日
Unity アニメーションイベント
マテリアルのシェーダーは Transparent/Diffuse を使用
TestGL2_b.cs |
---|
|
Unity GL (2) 四角形の描画
TestGL2.cs |
---|
|
2012年4月12日木曜日
Unity GL (1) ライン描画
GL.LINESでライン描画
空オブジェクトにスクリプトを追加、インスペクター上で、描画するメッシュを選択
TestGL1.cs |
---|
|
2012年4月7日土曜日
Unity WWW (2)
UnityのWWWで、ローカルホストにアクセスするテスト
サーバーにAIMLを実装したJ-Aliceを使用
ボット同士の会話
TestWWW2.cs |
---|
|
2012年4月1日日曜日
Unity ギズモの描画と編集
空のゲームオブジェクトにTestGizmo.csを追加
ギズモを選択、編集タイプに応じて移動、サイズ変更がシーンウィンドウで行える
Assets/Script/TestGizmo.cs |
---|
|
Assets/Editor/EditorTestGizmo.cs |
---|
|
2012年3月25日日曜日
C# ビープ音 (1)
// 救急車のサイレン音を再生
// ↓コンパイル方法
// csc /out:TestBeep.exe TestBeep.cs
class TestBeep
{
public static void Main()
{
int loopNum = 2; // ループ回数
for(int i = 0; i < loopNum; i++) {
System.Console.Beep(988, 900); // シー
System.Console.Beep(784, 900); // ソー
}
for(int i = 0; i < loopNum; i++) {
System.Console.Beep(932, 900); // シ♭ー
System.Console.Beep(740, 900); // ソ♭ー
}
for(int i = 0; i < loopNum; i++) {
System.Console.Beep(880, 900); // ラー
System.Console.Beep(698, 900); // ファー
}
}
}
2012年3月24日土曜日
Unity エディットウィンドウ(2) 三角形の描画
エディットウィンドウで三角形を描画するテスト
GLを使用すると描画できた
Editor/EditWindowD.cs
GLを使用すると描画できた
Editor/EditWindowD.cs
using UnityEngine;
using UnityEditor;
public class EditWindowD : EditorWindow {
Material m_Material; // マテリアル
Vector2 [] m_VecArray; // 頂点の配列
int m_VecNum = 3; // 頂点数
// メニューに追加
[MenuItem ("Window/EditWindowD")]
static void Init() {
EditWindowD window = (EditWindowD)EditorWindow.GetWindow( typeof (EditWindowD) );
window.Show();
}
// スクリプトのロード時に呼ばれる ScriptableObject.OnEnable()
void OnEnable() {
CreateVertexArray();
CreateMaterial();
}
// エディタウィンドウのGUI処理をここに記述 EditorWindow.OnGUI()
void OnGUI() {
// 再描画イベント時に描画処理を行う
if (EventType.Repaint != Event.current.type) return;
// 実行するとウィンドウが真っ白
//GL.Clear(false, true, Color.white);
m_Material.SetPass(0);
DrawLine();
}
// マテリアルの作成
void CreateMaterial() {
m_Material = new Material( "Shader \"Lines/Colored_Blended\" {" +
"SubShader { Pass { " +
" Blend SrcAlpha OneMinusSrcAlpha " +
" ZWrite Off Cull Off Fog { Mode Off } " +
" BindChannels {" +
" Bind \"vertex\", vertex" +
" Bind \"color\", color" +
"} } } }" );
m_Material.hideFlags = HideFlags.HideAndDontSave;
m_Material.shader.hideFlags = HideFlags.HideAndDontSave;
}
// 頂点の配列を作成
void CreateVertexArray() {
m_VecArray = new Vector2[m_VecNum];
m_VecArray[0] = new Vector2(50, 10);
m_VecArray[1] = new Vector2(10, 60);
m_VecArray[2] = new Vector2(90, 60);
}
// 線分の描画
void DrawLine() {
GL.Color(Color.blue);
GL.Begin( GL.LINES );
for(int i = 0; i < m_VecNum; i++) {
int idx0 = i;
int idx1 = (i == m_VecNum - 1) ? 0 : idx0 + 1;
GL.Vertex(m_VecArray[idx0]);
GL.Vertex(m_VecArray[idx1]);
}
GL.End();
}
}
2012年3月20日火曜日
Redis Cygwin上で使用
Redis v2.4.9 をDL
makeするとエラー発生
redis.c の setupSignalHandlers() SA_ONSTACK が未定義らしい
テストなので、SA_ONSTACKを削除して make -> OK
デフォルト設定でサーバー起動
./redis-server
設定ファイルを指定してサーバー起動
./redis-server redis.conf
クライアントを起動
./redis-cli
データの追加、取得を行ってみる
> SET key value1 # キーと値を設定
> GET key # キーの値を取得
> OK
#設定ファイル redis.conf
# ↓TODO
loglevel notice
maxmemory 1mb
MAXScript 形状のブール演算
-- メッシュのブール演算のテスト
fn Test5 = (
-- 形状を作成
s1 = box width:150 height:5
s2 = sphere radius:20
s2.pos.x = 50
s3 = pyramid depth:55
s3.pos.x = -50
s3.pos.z = 2.5
-- 減算
s1 = s1 - s2
-- 加算
s1 += s3
delete s2
delete s3
s1
)
Test5()
MAXScript 配列とビット配列
-- .NETオブジェクトの ArrayList を使用するテスト
fn TestArray1 = (
-- .NET のArrayListオブジェクトを取得
arrayList = dotNetObject "System.Collections.ArrayList"
-- ArrayListに要素を追加
arrayList.Add("A")
arrayList.Add("BC")
arrayList.Add("D")
-- 配列の要素数を出力
format "arrayList.Count = %\n" arrayList.Count
-- format "%\n" arrayList[1] -- ERROR
str = arrayList.ToString()
format "str = %\n" str
item1 = arrayList.Item(1)
format "%\n" item1
for i = 0 to arrayList.Count - 1 do (
-- ↓ ERROR発生
-- format "arrayList[%] = %\n" i arrayList[i] -- ERROR
-- 指定したインデックスの要素を取得
item = arrayList.Item(i)
format "arrayList[%] = %\n" i item
)
-- arrayList.Item(1) = "bc"
item1 = arrayList.Item(1)
format "item1 = %\n" item1
for i = 0 to arrayList.Count - 1 do (
-- ↓ get_Item()が出力される
format "arrayList[%] = %\n" i arrayList.Item(i)
)
)
-- 配列とビット配列のテスト
fn TestArray2 = (
-- 空の配列を作成
a = #()
-- 配列に値を追加
append a 1
append a 2
format "a = %\n" a
-- 配列の要素を削除
deleteItem a 2
--deleteItem a 1
format "a = % a.count = %\n" a a.count
-- 空のビット配列を作成
b0 = #{}
b1 = #{}
--b0[0] = true -- ERROR インデックスは1から開始
b0[1] = false
b0[20] = true
b0[32] = true
b1[8] = true
format "b0 = % b0.count = %\n" b0 b0.count
format "b1 = % b1.count = %\n" b1 b1.count
b2 = b0 + b1 -- OR演算
b3 = b0 * b1 -- AND演算
format "b0 + b1 = %\n" b2
format "b0 * b1 = %\n" b3
b4 = -b1 -- ビットの反転
format "-b1 = %\n" b4
b1[20] = true
b5 = b0 - b1 -- 差
format "b0 - b1 = %\n" b5
b6 = #{1..7, 16}
format "b6 = % b6.numberSet = %\n" b6 b6.numberSet
)
TestArray2()
2012年3月4日日曜日
2012年2月29日水曜日
MAXScript メッシュの作成(2)
ポリラインの作成
-- 制御点の配列からポリラインを作成
fn CreatePolyLineFromPosArray posArray lineWidth = (
ss = SplineShape pos:posArray[1] -- posArray[1]にSplineShapeを作成
idx = addNewSpline ss -- スプライン曲線を追加
format "NewSpline idx = %\n" idx
for i = 1 to posArray.Count do (
addKnot ss idx #corner #line posArray[ i ]
)
-- シェイプの更新
updateShape ss
-- [ビューポートを有効]チェックボックスをオン
ss.render_displayRenderMesh = true
-- 矩形断面モードにする
-- ss.render_viewport_rectangular = true
ss.render_rectangular = true
-- 矩形断面の設定値
-- ss.render_length = 5.0
ss.render_width = lineWidth
-- ss.render_viewport_length = 1.0
-- ss.render_viewport_width = lineWidth
-- メッシュに変換
convertToMesh ss
format "ss.numfaces %\n" ss.numfaces
-- アップベクトル
vUp = [0, 0, 1]
-- 削除する面のインデックスの配列
faceIdxArray = #()
for f = 1 to ss.numfaces do (
-- 面の法線を取得
n = getFaceNormal ss f
-- アップベクトルと面の法線の内積
d = dot vUp n
-- if d <= 0.0 do ( -- 削除されない面がある
if d <= 0.01 do (
-- 削除する面のインデックスを追加
append faceIdxArray f
)
)
-- 道路以外のメッシュを削除
meshop.deleteFaces ss faceIdxArray delIsoVerts:false
-- UVWMapモディファイアの追加
-- maptype 0 - 6
addModifier ss (UVWMap maptype:5) -- maptype 0:Planar 4:Box 5: Face
ss
)
-- CreatePolyLineFromPosArrayのテスト
-- 制御点の配列
gPosArray1 = #()
gPosArray2 = #()
-- 制御点を追加
append gPosArray1 [0, 0, 0]
append gPosArray1 [200, 0, 0]
append gPosArray1 [200, 50, 0]
append gPosArray1 [250, 250, 0]
append gPosArray1 [300, 450, 0]
append gPosArray1 [50, 500, 0]
append gPosArray2 [0, -50, 0]
append gPosArray2 [0, 100, 0]
-- 線の幅
lineWidth = 25.0
-- メッシュを作成
newSpline1 = CreatePolyLineFromPosArray gPosArray1 lineWidth
classof newSpline1
newSpline2 = CreatePolyLineFromPosArray gPosArray2 lineWidth
-- メッシュの加算
newSpline1 = newSpline1 + newSpline2
-- 追加したメッシュを削除
delete newSpline2
2012年2月26日日曜日
Unity 処理時間計測 (2)
C#版
using System;
using System.Collections.Generic;
using System.Collections;
using UnityEngine;
class TestObject {
int n;
string name;
public TestObject() {
n = 0;
name = "abc";
}
}
// テスト用のクラス
public class TestClass : MonoBehaviour {
const int ArrayNum = 5000; // 配列数
float fBaseTime = 0.0f;
float fCurTime = 0.0f;
int [] array; // 配列
System.Collections.ArrayList al0;
System.Collections.ArrayList al1;
System.Collections.ArrayList al2;
System.Collections.ArrayList al3;
void Start() {
TestArray();
}
void Update() {
if(Input.GetKeyDown(KeyCode.Alpha1)) {
StartCoroutine( WaitFunc(1.0F) );
}
if(Input.GetKeyDown(KeyCode.Alpha2)) {
StartCoroutine( WaitFunc(1.5F) );
}
if(Input.GetKeyDown(KeyCode.Alpha4)) {
TestArray();
}
}
// 配列のテスト
void TestArray() {
// 配列の作成
array = new int [ ArrayNum ];
al0 = new ArrayList();
al1 = new ArrayList();
al2 = new ArrayList();
al3 = new ArrayList();
// Test1 何もしない
fBaseTime = Time.realtimeSinceStartup;
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test1 time = " + ((fCurTime - fBaseTime) * 1000.0f).ToString()+"(ms)");
// Test2 配列に値セット
fBaseTime = Time.realtimeSinceStartup;
for(int i = 0; i < ArrayNum; i++) {
array[i] = i;
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test2 time = " + ((fCurTime - fBaseTime) * 1000.0f).ToString()+"(ms)");
// Test3 配列に整数を追加
fBaseTime = Time.realtimeSinceStartup;
for(int i = 0; i < ArrayNum; i++) {
al0.Add( i );
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test3 time = " + ((fCurTime-fBaseTime) * 1000.0f).ToString()+"(ms)");
Debug.Log("al0.Count = " + al0.Count);
// Test4 配列に整数を追加
fBaseTime = Time.realtimeSinceStartup;
for(int i = 0; i < ArrayNum; i++) {
al1.Add( 9876 );
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test4 time = " + ((fCurTime-fBaseTime) * 1000.0f).ToString()+"(ms)");
// Test5 配列に文字列を追加
fBaseTime = Time.realtimeSinceStartup;
for(int i = 0; i < ArrayNum; i++) {
al2.Add( "abcdefghijklmnopqrstu" );
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test5 time = " + ((fCurTime-fBaseTime) * 1000.0f).ToString()+"(ms)");
// Test5 配列にクラスを追加
fBaseTime = Time.realtimeSinceStartup;
for(int i = 0; i < ArrayNum; i++) {
TestObject o = new TestObject();
al3.Add( o );
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test6 time = " + ((fCurTime-fBaseTime) * 1000.0f).ToString()+"(ms)");
}
IEnumerator WaitFunc(float t) {
fBaseTime = Time.realtimeSinceStartup;
yield return new WaitForSeconds( t );
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test6 time = " + ((fCurTime-fBaseTime) * 1000.0f).ToString()+"(ms)");
}
}
Unity 処理時間計測 (1)
Time.realtimeSinceStartup を使用
JavaScript版
JavaScript版
private var nArrayNum : int = 5000;
private var numArray : int[];
private var arr0 : Array;
private var fBaseTime : float = 0.0f;
private var fCurTime : float = 0.0f;
function Start() {
TestArray();
}
function Update() {
if(Input.GetKeyDown(KeyCode.Keypad4)) {
TestArray();
}
}
// 配列のテスト
function TestArray() {
var i : int = 0;
numArray = new int[ nArrayNum ];
arr0 = new Array();
// Test1
fBaseTime = Time.realtimeSinceStartup;
for(i = 0; i < nArrayNum; i++) {
numArray[i] = i;
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test1 time = " + ((fCurTime - fBaseTime) * 1000.0f).ToString() + "(ms)");
// Test2
fBaseTime = Time.realtimeSinceStartup;
for(i = 0; i < nArrayNum; i++) {
arr0.Push( i );
}
fCurTime = Time.realtimeSinceStartup;
Debug.Log("Test2 time = " + ((fCurTime - fBaseTime) * 1000.0f).ToString() + "(ms)");
}
2012年2月18日土曜日
MAXScript メッシュの作成 (1)
SplineShapeを作成 -> 押し出して何かするテスト
-- 制御点の配列
gPosArray = #()
append gPosArray [20, 10, 0]
append gPosArray [20, -10, 0]
append gPosArray [-20,-20, 0]
append gPosArray [-20, 25, 0]
-- シンプルなメッシュの作成
-- SplineShapeを作成して押し出す
-- posArray 制御点の配列
-- Height SplineShapeを押し出す高さ
-- Outline 輪郭の押し出し値
fn CreateSimpleMesh posArray Height Outline= (
-- SplineShapeを作成
local sp = splineShape()
idx = addnewSpline sp
for i = 1 to posArray.Count do (
addKnot sp idx #corner #line posArray[ i ]
)
close sp idx
updateShape sp
-- メッシュに変換
convertToMesh sp
-- 全面の押し出し
meshop.extrudeFaces sp #{ 1.. sp.numfaces } Height Outline
-- メッシュの面のマテリアルIDを変更
newMtlID = 2
setFaceMatID sp 1 newMtlID -- Face 1
setFaceMatID sp 2 newMtlID -- Face 2
/*
-- 面のマテリアルIDを取得
for i = 1 to sp.numfaces do (
format "Face % Mtl ID = %\n" i ( getFaceMatID sp i )
)
*/
-- UVWMapモディファイアの追加
addModifier sp (UVWMap maptype:4) -- maptype 4:Box
sp
)
-- メッシュを作成
mesh1 = CreateSimpleMesh gPosArray 100.0 -2.0
mesh1.pos = [100, 0, 0]
mesh2 = CreateSimpleMesh gPosArray 50.0 0.0
mesh2.pos = [0, 50, 0]
mesh3 = CreateSimpleMesh gPosArray 25.87 15.0
mesh3.pos = [-50, -80, 0]
MAXScript ストリングストリーム
StringStream
-- テストその1
fn TestStringStream1 = (
-- 空のStringStreamを作成
ss1 = stringStream ""
-- ss1 = stringStream -- ERROR
-- ss1に出力
format "ABC %" "123456789" to:ss1
-- シーク位置を先頭にする
seek ss1 0
-- 読み込んだ行を出力 シーク位置が進む
format "%\n" ( readLine ss1 )
-- ストリームの終了チェック
isEnd = eof ss1
format "isEnd = %\n" isEnd -- true
)
-- テストその2
fn TestStringStream2 = (
-- .NETクラスを取得
dnDayTime = dotNetClass "System.DateTime"
dnTimeZone = dotNetClass "System.TimeZone"
-- 日付を取得
currentDate = dnDayTime.Now
currentYear = currentDate.Year
-- 空のStringStreamを作成
ss = stringStream ""
-- ssに書き込む
format "Current Year = %\n" currentYear to:ss
format "Month = %\n" currentDate.Month to:ss
format "Day = %" currentDate.Day to:ss
-- ssの内容を出力
seek ss 0
while not eof ss do (
format "%\n" (readLine ss)
)
-- print (readLine ss)
-- while not eof ss do print ( readLine ss )
)
TestStringStream1()
TestStringStream2()
2012年2月17日金曜日
MAXScript マテリアルエディタの操作 (2) マルチ
マルチマテリアルを作成するスクリプト
・作成するスロット番号を選択
・サブマテリアル数を選択
・Createボタンを押す
・画像選択ダイアログで画像選択
-- dropdownlist作成用の配列
slotNoArray = #()
subMtlNumArray = #()
-- デフォルト値
defaultSlotNo = 1 -- スロット番号
defaultSubMtlNum = 2 -- サブマテリアル数
-- 初期化処理
fn Init = (
-- スロット番号
for i = 1 to 24 do (
append slotNoArray ( i as string )
)
-- サブマテリアル数
for i = 1 to 10 do (
append subMtlNumArray ( i as string )
)
)
-- マルチマテリアルを作成
-- slotNo: スロット番号
-- subMtlNum: サブマテリアル数
fn CreateMultiMtl slotNo subMtlNum = (
-- モードのセット
MatEditor.mode = #basic
-- 状態取得
isOpen = MatEditor.isOpen()
-- マテリアルエディタを開く
if false == isOpen do ( MatEditor.Open() )
-- マルチマテリアルを作成
newMtl = multimaterial ()
-- 画像を読み込む
for i = 1 to subMtlNum do (
-- Captionの文字列
ss = stringStream ""
format "Select SubMtl Texture %" i to:ss
seek ss 0
str = ( readLine ss )
-- 画像を選択
local img = selectBitMap caption:str
if undefined == img do ( return undefined )
-- 選択画像からBitmapTextureを作成
local bmTex = BitmapTexture bitmap:img
-- マテリアルを作成
local mtl = standardMaterial diffuseMap:bmTex showInViewport:true
newMtl[i] = mtl
)
-- マテリアルをスロットにセット
setMeditMaterial slotNo newMtl
)
-- ロールアウト
rollout RolloutMtl "CreateMultiMaterial"
(
-- スロット数選択用
dropdownlist dSlotNo "Slot No:" pos:[16, 16] \
items:slotNoArray width:80
-- サブマテリアル数選択用
dropdownlist dNumSubMtl "Sub Material Num:" pos:[120, 16] \
items:subMtlNumArray width:80 selection:defaultSubMtlNum
-- 作成ボタン
button btnCreate "Create" width:96 height:24 pos:[64, 64]
on btnCreate pressed do (
CreateMultiMtl dSlotNo.selection dNumSubMtl.selection
)
)
Init()
createDialog RolloutMtl width:240 height:100
MAXScript マテリアルエディタの操作 (1)
-- マテリアルエディタの操作テスト
fn TestMedit = (
-- モード取得
format "Medit mode = %\n" MatEditor.mode
-- マテリアルエディタを開く
MatEditor.Open()
isOpen = MatEditor.isOpen()
format "isOpen = %\n" isOpen
-- スロットからマテリアルを取得
mtl1 = getMeditMaterial 1
format "mtl1.name = %\n" mtl1.name
-- マテリアルのプロパティの変更
mtl1.diffuse = yellow
-- スロットにマテリアルを設定
-- 画像を読み込む
img = selectBitMap ()
if undefined == img do return undefined
-- 選択画像からBitmapTextureを作成
bmTex = BitmapTexture bitmap:img
-- スロットにマテリアルをセット
newMtl = standardMaterial diffuseMap:bmTex
setMeditMaterial 2 newMtl
format "newMtl.name = %\n" newMtl.name
-- newMtl = standardMaterial diffuseMap:( checker() )
-- setMeditMaterial 3 newMtl
-- マテリアルエディタを閉じる
-- MatEditor.Close()
)
TestMedit()
2012年2月15日水曜日
MAXScript xmlのテスト
dotNetObjectを使う
-- Xml Test 文字列
xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rootElem ver = \"2.1\">
<childElemA str = \"A\" num = \"123\"/>
<childElemA str = \"A\" num = \"456\"/>
<childElemB str = \"B\"/>
</rootElem>"
-- XmlElementの属性値を取得
fn GetAttrib elem elemName = (
if true == elem.HasAttribute( elemName ) then (
return elem.GetAttribute( elemName )
)
return undefined
)
-- System.Xml.XmlDocument オブジェクトを作成
xmlDoc = dotNetObject "System.Xml.XmlDocument"
xmlDoc.LoadXml xmlString -- 文字列からXMLを読み込む
xmlDoc.LocalName
-- ルートXmlElementを取得
rootElem = xmlDoc.DocumentElement
-- 属性値を取得
GetAttrib rootElem "ver" -- "2.1"
GetAttrib rootElem "Ver" -- undefined
-- 子ノードの属性値を取得
elemList = rootElem.GetElementsByTagName("childElemA");
for i = 1 to elemList.Count do (
n = elemList.ItemOf (i - 1) -- ノードを取得
format "v = %\n" ( GetAttrib n "num" )
format "v = %\n" ( GetAttrib n "Num" ) -- undefined
)
2012年2月12日日曜日
Unity WWW (1)
(笑)の略ではなくWorld Wide Web
System.Web.HttpUtility.UrlEncodeが使えない
WWW.EscapeURL()の結果がおかしい?
指定したurlにアクセスして受信結果をテキストファイルに保存するテスト
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Text;
//using System.Web; // ERROR System.Webが無い
using UnityEngine;
public class TestWWW : MonoBehaviour
{
public IEnumerator Start() {
// URLエンコードを行う 結果が"abc+123"
print(WWW.EscapeURL("abc 123"));
string url = "http://www.google.co.jp/";
WWW www = new WWW(url);
yield return www;
// ShiftJisのエンコーディングを取得
int codepage = 932;
Encoding enc = Encoding.GetEncoding( codepage );
// 受信結果をファイルに保存 ファイルはプロジェクトフォルダにある
StreamWriter sw = new StreamWriter("./result.html", false, enc);
// sw.Write(www.text); // 文字化けしている
// wwwのバイト配列から文字列を取得
string strShiftJis = enc.GetString( www.bytes );
sw.Write(strShiftJis);
sw.Close();
print("Start() end");
}
}
2012年2月11日土曜日
MAXScript ノードのプロパティを変更
/*
vFromベクトルからvToベクトルまでの角度を取得
*/
fn GetAngle vFrom vTo =
(
vFrom = normalize vFrom
vTo = normalize vTo
rotDot = dot vFrom vTo
rotAngle = acos rotDot -- 角度は度
)
/*
座標がノードの右側に位置するか判定
nodeMtx ノードの行列
pos 判定する座標
*/
fn IsRightSide nodeMtx pos =
(
toPos = pos - nodeMtx.translation
right = -nodeMtx.row1 -- ノードのRightベクトル
d = dot right toPos
if d > 0.0 do ( return true )
return false
)
-- MAXWrapperのプロパティを変更するテスト
fn Test1 =
(
-- ターゲット
target = mesh vertices:#([0,0,0],[10,0,40],[-10,0,40]) \
faces:#([1,2,3]) materialIDS:#(1)
target.pos = [-25, 75, 0]
target.name = "Target"
-- オブジェクトの作成
-- 三角形のメッシュを作成
tri = mesh vertices:#([0,-20,0],[10,10,0],[-10,10,0]) \
faces:#([1,2,3]) materialIDS:#(1)
-- オイラー角を作成
rotAngle = eulerAngles 0.0 0.0 -45.0
-- 回転の変更
-- tri.rotation = rotAngle as quat
-- 位置の変更
tri.pos = [0, 0, 0]
-- スケールの変更
tri.scale = [1, 2, 1]
-- 選択状態の変更
tri.isSelected = true
-- ノードの行列
format "mtx %\n" tri.transform
-- ノードのローカルのZ方向
format "dir %\n" tri.dir
-- オブジェクトからターゲットまでのベクトル
vToTarget = target.pos - tri.pos
-- オブジェクトの進行方向
vFwd = -tri.transform.row2
-- ターゲットに向ける角度を取得
rotAngle = GetAngle vFwd vToTarget
format "rotAngle %\n" rotAngle
-- ターゲットの座標がオブジェクトの右側か判定
isRight = IsRightSide tri.transform target.pos
format "isRight %\n" isRight
if isRight == false do ( rotAngle = -rotAngle )
-- オブジェクトの正面がターゲットを向くように回転させる
rotAngle = eulerAngles 0.0 0.0 rotAngle
tri.rotation = rotAngle as quat
)
Test1()
2012年2月7日火曜日
OpenCVでペイント
OpenCVのテスト用
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
cv::Mat g_Canvas; // キャンバス
cv::Mat g_Palette; // 描画色
cv::Size g_CanvasWndSize(640, 480); // キャンバスサイズ
const char* g_CanvasWndName = "window";
const char* g_PalWndName = "palette";
bool g_bLBtnDown = false;
int g_TrackBarValue[3] = { 0 }; // トラックバーの値
// 指定座標にピクセル描画
void DrawPixel(cv::Mat* pMat, int x, int y, int pixelSize)
{
cv::Scalar color(g_TrackBarValue[2], g_TrackBarValue[1], g_TrackBarValue[0]);
cv::Point p0(x - pixelSize, y - pixelSize);
cv::Point p1(x + pixelSize, y + pixelSize);
cv::rectangle(*pMat, p0, p1, color, -1, CV_AA);
}
// マウスイベントの処理
static void onMouse(int event, int x, int y, int flag, void* ptr)
{
switch(event) {
case cv::EVENT_MOUSEMOVE:
if(g_bLBtnDown) {
// キャンバスにピクセル描画
DrawPixel(&g_Canvas, x, y, 4);
// 変更を反映
cv::imshow(g_CanvasWndName, g_Canvas);
}
break;
case cv::EVENT_LBUTTONDOWN:
g_bLBtnDown = true;
break;
case cv::EVENT_LBUTTONUP:
g_bLBtnDown = false;
break;
}
}
// 指定色で塗りつぶす
void FillColor(cv::Mat* pMat, int r, int g, int b)
{
*pMat = cv::Scalar(b, g, r);
}
// トラックバーのイベントハンドラ
void onTrackbarRed(int val, void* ptr)
{
g_TrackBarValue[0] = val;
FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
cv::imshow(g_PalWndName, g_Palette);
}
void onTrackbarGreen(int val, void* ptr)
{
g_TrackBarValue[1] = val;
FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
cv::imshow(g_PalWndName, g_Palette);
}
void onTrackbarBlue(int val, void* ptr)
{
g_TrackBarValue[2] = val;
FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
cv::imshow(g_PalWndName, g_Palette);
}
int main( int argc, char **argv )
{
// Matを作成
g_Canvas = cv::Mat(g_CanvasWndSize.height, g_CanvasWndSize.width, CV_8UC3);
g_Palette = cv::Mat(64, 512, CV_8UC3);
FillColor(&g_Palette, g_TrackBarValue[0], g_TrackBarValue[1], g_TrackBarValue[2]);
// ウィンドウ作成
cv::namedWindow(g_CanvasWndName, CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::namedWindow(g_PalWndName, CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
// マウスのコールバック関数をセット
cv::setMouseCallback(g_CanvasWndName, onMouse, NULL);
// トラックバーをウィンドウに作成
cv::createTrackbar("Red", g_PalWndName, &g_TrackBarValue[0], 255, onTrackbarRed, 0);
cv::createTrackbar("Green", g_PalWndName, &g_TrackBarValue[1], 255, onTrackbarGreen, 0);
cv::createTrackbar("Blue", g_PalWndName, &g_TrackBarValue[2], 255, onTrackbarBlue, 0);
// ウィンドウにMatを表示
cv::imshow(g_CanvasWndName, g_Canvas);
cv::imshow(g_PalWndName, g_Palette);
// キー入力待ち
cv::waitKey(0);
return 0;
}
2012年2月4日土曜日
Unity ボーン行列の変更(1)
MonoBehaviour.LateUpdate()内で
変更処理を実行すると描画に反映される
/*
ボーンのTransform
インスペクタ上で変更するボーンを指定
or GameObject.Find("...")でボーンを取得
*/
public Transform testBone;
/*
MonoBehaviour.LateUpdate
MonoBehaviour.Update 後に呼ばれる
*/
public void LateUpdate () {
/*
ボーンの位置を変更
子のボーンにも変更が適用される
*/
testBone.position = new Vector3(0.0f, 0.5f, 0.0f);
}
2012年1月31日火曜日
MAXScript ハイトマップからメッシュの作成(1)
Bmp, Jpeg画像のハイトマップから地形を作成するスクリプト
-- ビットマップ
gBitmap = undefined
-- 平面のサイズ
gPlaneSizeX = 500.0
gPlaneSizeY = 500.0
-- 平面のセグメント数
gNumSegX = 25
gNumSegY = 25
-- 最大の高さ
gHeightMax = 25.0
-- メッシュの作成
fn CreatePlaneMesh len wid segX segY =
(
m = mesh length:len width:wid lengthsegs:segY widthsegs:segX
return m
)
-- セグメントのインデックスからピクセルのインデックスを取得
fn GetPixIdx segIdx segNum pixNum =
(
segIdxF = segIdx as float
segNumF = segNum as float
f = segIdxF / segNumF
pixIdx = f * (pixNum - 1)
return pixIdx as integer
)
-- メッシュの指定したインデックスの頂点に高さをセット
fn SetHeight m idx height =
(
v = patch.getVert m idx
v.z = height
patch.setVert m idx v
)
-- メッシュにハイトマップの高さをセット
fn Mesh_SetHeightMap m nSegX nSegY bm =
(
-- 高さをセットするメッシュの頂点のインデックス
idx = 1
bmWidth = bm.width
bmHeight = bm.height
for y = 0 to nSegY do (
pixY = GetPixIdx y nSegY bmHeight
pixY = pixY as integer
for x = 0 to nSegX do (
pixX = GetPixIdx x nSegX bmWidth
pixX = pixX as integer
-- ビッドマップからピクセルの配列を取得
pixArray = getPixels bm [pixX, pixY] 1
-- 高さ
h = pixArray[1].r / 255.0
h = h * gHeightMax
SetHeight m idx h
idx = idx + 1
)
)
)
-- ハイトマップからメッシュを作成
fn CreateMeshFromHeightmap =
(
-- ハイトマップを開く
fPath = getOpenFileName caption:"Open Heightmap:" \
types:"Bmp(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg"
if fPath == undefined then return -1
gBitmap = openBitMap fPath
format "w = % h = %\n" gBitmap.width gBitmap.height
-- メッシュを作成
m = CreatePlaneMesh gPlaneSizeX gPlaneSizeY gNumSegX gNumSegY
-- パッチに変換
convertTo m Editable_Patch
-- 高さをセット
Mesh_SetHeightMap m gNumSegX gNumSegY gBitmap
)
-- テスト
CreateMeshFromHeightmap()
MAXScript ビットマップの作成
-- ビットマップサイズ
gBitmapWidth = 256
gBitmapHeight = 8
-- グラデーションビットマップを作成
fn CreateGradBitmap =
(
b_width = gBitmapWidth
b_height = gBitmapHeight
-- ビットマップを作成
b = bitmap b_width b_height
-- 列のループ
for h = 0 to (b_height - 1) do
(
-- 行のピクセル配列を収集
row = for w = 0 to (b_width - 1) collect
(
-- 補間係数
t = w as float / (b_width - 1)
-- rowにカラー値を追加
if undefined != gSpline then
(
-- スプラインから座標を取得
pos = interpCurve3D gSpline gSplineIdx t
white * (pos.y / 100.0)
)else (
white * t
)
)
-- 収集したピクセル配列をセット
setpixels b [0, h] row
)
return b
)
-- ビットマップを作成
b = CreateGradBitmap()
-- ビットマップを表示
if undefined != b then display b
MAXScript ベジェ曲線の作成
gSpline = undefined
gSplineIdx = 0
-- スプラインシェイプを作成
fn CreateSpline =
(
if undefined != gSpline then return -1
-- シェイプの作成
ss = splineShape()
-- シェイプにスプライン曲線を追加
idx = addnewSpline ss
-- addKnotのパラメータ
param3 = #bezier
param4 = #curve
-- bezier曲線の制御点のイン、アウトベクトルの座標
inPos0 = [0, 0, 0]
outPos0 = [0, 0, 0]
inPos1 = [30, 10, 0]
outPos1 = [70, 40, 0]
inPos2 = [100, 100, 0]
outPos2 = [100, 100, 0]
-- 制御点の追加
addKnot ss idx param3 param4 [0, 0, 0] inPos0 outPos0
addKnot ss idx param3 param4 [50, 20, 0] inPos1 outPos1
addKnot ss idx param3 param4 [100, 100, 0] inPos2 outPos2
-- シェイプの更新
updateShape ss
-- コピー
gSpline = ss
gSplineIdx = idx
return 0
)
-- 形状データ取得テスト
fn GetShapeDataTest ss idx =
(
-- セグメント数
nSeg = numSegments ss idx
format "nSeg %\n" nSeg
-- 曲線の座標
for t = 0.0 to 1.0 by 0.1 do
(
pos = interpCurve3D ss idx t
format "t = % pos = %\n" t pos
)
)
CreateSpline()
GetShapeDataTest gSpline gSplineIdx
2012年1月28日土曜日
MAXScript ルートボーンの移動アニメを変更してみる(2)
あるモデルのルートボーンの移動アニメを無効にしたい
/* 選択したボーンの全フレームの座標変更 pos: セットする座標 使用方法 トラックビュー選択ダイアログが表示されるので 変更したいボーンの"Transform : Position/Rotation/Scale" を選択してOKボタンを押す */ fn SetSelectBonePosAllKey pos = ( -- ダイアログ表示オプション dlgOpt = 0 dlgOpt = bit.set dlgOpt 1 true --アニメトラックのみ -- dlgOpt = bit.set dlgOpt 3 true --選択したノードのみ -- ダイアログを表示 tvp = trackview.pickTrackDlg options:dlgOpt if tvp == undefined then return -1 -- 未選択 format "tvp.name %\n" tvp.name -- 選択した項目の名前 if "Transform" != tvp.name then return 1 c0 = tvp.client -- 選択項目の親のMAXWrapper if c0 != undefined then ( cname = getClassName c0 format "c0.className %\n" cname if cname != "Bone" then return 2 ) -- 選択項目のサブアニメを取得 subAni = tvp.anim if subAni == undefined then return 3 -- サブアニメ数 format "subAni.numSubs %\n" subAni.numSubs ret = 4 for i = 1 to subAni.numSubs do ( -- サブアニメの名前 n = getSubAnimName subAni i format "subAnim name %\n" n -- Positionのみ変更 if 0 != stricmp n "position" then continue -- コントローラーの取得 c = subAni[i].Controller if c == undefined then continue -- コントローラーからキーの配列を取得 keys = c.keys -- キーフレーム数 format "key_array count %\n" keys.count -- 全キーフレームの座標を変更 for j = 1 to keys.count do ( keys[j].value = pos ) ret = 0 ) return ret ) gPos = [0, 0, 0] -- セットする座標 SetSelectBonePosAllKey gPos
Android カメラデバイスを使用(1)
AndroidManifest.xmlのmanifestタグ内に以下の記述を追加
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
ActivityのonCreateでセットするコンテキストビューを変更
//setContentView(R.layout.main);
setContentView(new CameraPreview(this));
カメラプレビュー用のクラスを作成
// カメラ数を取得 カメラが無いと0?
int camNum = Camera.getNumberOfCameras();
Log.d(LogTag, "nNumCamera = " + camNum);
// カメラの作成
int id = 0; // 0:Out, 1:Inカメラだった
camera = Camera.open(id);
// カメラにSurfaceHolderをセット
camera.setPreviewDisplay(holder);
// プレビューの開始
camera.startPreview();
// カメラの停止
camera.stopPreview();
camera.release();
2012年1月27日金曜日
ghostTown
SQLiteのRTreeを使用してみる
sqliteからソースを取得
プリプロセッサの定義に SQLITE_ENABLE_RTREE を追加してライブラリを作成
プリプロセッサの定義に SQLITE_ENABLE_RTREE を追加してライブラリを作成
#include <stdio.h>
#include <sqlite3.h>
// SELECTのコールバック関数
static int SelectCallbackFunc(void* option, int columnCount, char** columnValues, char** columnNames) {
for(int i = 0; i < columnCount; ++i) {
printf("| %s %s |", columnNames[i], columnValues[i]);
}
printf("\n");
return 0;
}
// SQL文の実行
int ExecSQL(sqlite3* db, const char* sql, sqlite3_callback cb) {
char* pStr = NULL;
if(sqlite3_exec(db, sql, cb, NULL, &pStr) != SQLITE_OK) {
fprintf(stderr, "Error %s %d: %s %s\n", __FILE__, __LINE__, pStr, sql);
return -1;
}
return 0;
}
int main(int argc, char* argv[]) {
sqlite3* pDB = NULL;
const char* fname = ":memory:"; // メモリに作成
// const char* fname = "data.db"; // ファイルに作成
// DBを開く
if(sqlite3_open(fname, &pDB)) {
fprintf(stderr, "Error %s %d: %s\n", __FILE__, __LINE__, sqlite3_errmsg(pDB));
sqlite3_close(pDB);
return -1;
}
// テーブルの作成 RTreeを使用
ExecSQL(pDB, "CREATE VIRTUAL TABLE tbl_index USING rtree( id, minX, maxX, minY, maxY, minZ, maxZ );", NULL);
// テーブルにデータを追加
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 1, -100.0, -50.0, 30.0, 50.0, -50.0, -20.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 2, -50.0, -10.0, 30.0, 31.35, -50.0, -40.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 3, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 4, 100.0, 110.0, 40.0, 56.2, -50.0, -20.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 5, 112.0, 119.0, 35.0, 36.51, 10.0, 18.0 );", NULL);
// データの検索
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=100.0 AND maxX<=110.0;", SelectCallbackFunc);
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=-5.0 AND maxX<=5.0 AND minZ>=-5 AND minZ<=5;", SelectCallbackFunc);
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=150.0;", SelectCallbackFunc);
// DBを閉じる
sqlite3_close(pDB);
return 0;
}
実行結果
| id 4 |
| id 3 |
2012年1月26日木曜日
MAXScript ノードの列挙
g_tabnum = 0 -- タブ数
-- タブ文字列を取得する num: タブ数
fn GetTab num =
(
t = ""
for i = 1 to num do
(
t += "\t"
)
return t
)
-- 再帰関数でノードを列挙する
fn EnumNode n =
(
t = GetTab g_tabnum
g_tabnum += 1
for n in n.children do
(
-- クラス名の取得
cname = getClassName n
-- format "%className: %\n" t cname
if cname == "Bone" then
(
-- ボーン名を出力する
format "%boneName: %\n" t n.name
)
EnumNode n -- 再帰処理
)
g_tabnum -= 1
)
-- ノードの列挙
EnumNode rootNode
MAXScript ファイルにバイナリ形式のデータを書き出す
-- Floatの大きな値
BIG_FLOAT = 1.0e32
-- AABB
struct AABB
(
vMin,
vMax
)
-- AABBを取得
fn GetAABB =
(
local v = AABB()
v.vMin = [ BIG_FLOAT, BIG_FLOAT, BIG_FLOAT ]
v.vMax = [-BIG_FLOAT, -BIG_FLOAT, -BIG_FLOAT]
return v
)
-- binStreamにPoint3を書き込む
fn WritePoint3 bstream v =
(
WriteFloat bstream v.x
WriteFloat bstream v.y
WriteFloat bstream v.z
)
-- ファイルにAABBの値を書き込む
fn WriteAabbToFile filePath aabb =
(
file = fopen filePath "wb"
WritePoint3 file aabb.vMin
WritePoint3 file aabb.vMax
fclose file
)
-- ファイルにデータを書き込むテスト
fname = "test.bin" -- ファイル名
fdir = (GetDir #export) -- ファイルを書き込むディレクトリ
fpath = fdir + "\\" + fname
aabb = GetAABB()
aabb.vMin.x = 8.0
aabb.vMax.z = 0.0
WriteAabbToFile fpath aabb
2012年1月25日水曜日
MAXScript ルートボーンの移動アニメを変更してみる
/*
トラック内のキーの値を変更してみるテスト
*/
fn Test_TrackView =
(
format "Test start\n"
-- トラック選択ダイアログを表示する
theInt = 0 -- ダイアログのオプション用変数
theInt = bit.set theInt 1 true --animated tracks only
-- theInt = bit.set theInt 3 true --display selected nodes only
-- Track View Pick Dialogを表示
tvp = trackview.pickTrackDlg options:theInt
if tvp == undefined then return undefined
-- 選択ノードのsubAnimを取得
a = tvp.anim
if a == undefined then return undefined
-- Transformを選択してOKクリックだと3 Transform/Positionを選択した場合0
format "a.numSubs %\n" a.numSubs -- 選択ノードの子ノード数が返った
for i = 1 to a.numSubs do
(
-- 子ノードの名前の取得
n = getSubAnimName a i
format "name %\n" n
-- コントローラーの取得
c = a[i].Controller
if c != undefined then
(
-- コントローラーからキーの配列を取得
k = c.keys
--kp = k[#position] -- ERROR
--format "kp %\n" kp[3].value
format "k.count %\n" k.count -- キーフレーム数が返った
-- MAXKey
--format "MaxKey %\n" k[2]
--if n == "#position" then
-- if 0 == stricmp n "#position" then -- 実行されない
if 0 == stricmp n "position" then -- #がいらない
(
format "POSITION\n"
-- 移動アニメを無効にしてみるテスト 変更できた
for j = 1 to k.count do
(
k[j].value.z = 0.0
)
)
format "key value %\n" k[2].value -- キーの値が出力された
)
)
format "tvp.name %\n" tvp.name -- 選択したオブジェクトの名前?
format "tvp.subNum %\n" tvp.subNum -- subAnimの数
format "Test end\n"
)
-- Test関数の実行
Test_TrackView()
Unity キーフレームアニメ
// 空のアニメーションカーブを作成
AnimationCurve animCurve = new AnimationCurve();
// キーフレームの追加
animCurve.AddKey( new Keyframe(0.0f, 1.0f) );
animCurve.AddKey( new Keyframe(2.0f, 0.1f) );
// アニメーションカーブの値を取得
print(animCurve.Evaluate(0.0f)); // 1.0
print(animCurve.Evaluate(1.25f)); // 0.3847657
print(animCurve.Evaluate(2.0f)); // 0.1
print(animCurve.Evaluate(2.5f)); // 0.1
KeyframeのinTangentとoutTangentの値は0
登録:
投稿 (Atom)