myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | mLocker キネマティックスロック

今日は Diablo 3 のサーバには入れなくて、とりあえずTwitterを開いて見ていたら LandYさんは Lock をスクリプトでやりたいみたいなことをつぶやいていました。

確かに何ヶ月前にそのようなスクリプトを書いたから、見つけたらアップしようと思って、ハードディスクを探ってみました。

あった!
あったけど、コードはちょっと恥ずかしい。

全部 try と Unlock コマンドでやっていました。なんか格好悪いな。

ロックされていないオブジェクトをロックしようとすると、エラーが出てしまいます。

これを防ぐために、当時 try でやっていました。


try { Unlock (oObj(i) + ".kine.local.sclx", siLockLevelAll);
}
catch(err){}


一応仕事はしてくれます。

でも、どうせならもう少し美しいコードにしようかと思って、書き直しました。
Diablo3出来ないし。


今度はコマンドじゃなくてパラメーターでロックしてみました。


// JScript / UNLOCK sclx
if (obj.kinematics.Local.sclx.Locklevel != 0 ) obj.kinematics.Local.sclx.UnSetLock();


// JScript / LOCK sclx
obj.kinematics.Local.sclx.SetLock(locklevel);


という感じです。

なんで UnSetLock があるのか。
SetLock (0) にすれば アンロック になるんじゃないか!と思いきや、出来ませんでした。
なぜか出来ないようにしてあります。


ここまでは難しいことではないけど、ロックレベルは良く分かりません。

siLockLevel をみると:

siLockLevel.siLockLevelNone // 0
siLockLevel.siLockLevelConstruction // 1
siLockLevel.siLockLevelAnimation // 2
siLockLevel.siLockLevelManipulation // 4
siLockLevel.siLockLevelNavigation // 8
siLockLevel.siLockLevelAll // 65535



となっていますが、

普通にロックして、Locklevel で取得すると:
アニメーションロック (siLockLevelAnimation) は 3
Value ロック (siLockLevelManipulation) は 7

マニュアルによると 2 であるはずの siLockLevelAnimation は 3
そして 4 であるはずの siLockLevelManipulation は 7 になっています。

どういうことですか?

誰か分かりますか?

どうやって変換されるんですか?

ただのプリントミスでしょうか?

それとも、あれですね、基礎的な知識が足りないからこの変換が分からないとか?



考えても答えが出てこないからとりあず 3 と 7 でやります。


そして、PPGを付けて、こうなりました:

mLocker.jpg

DOWNLOAD
※ ローカルキネマティックスしか対応していません。



もう Diablo 3 には入れそうだけど、遅いよな・・・。ちょっとでもやろうか。

それでは、また。


追記

Diablo 3 サーバーはまだダウン。やっぱり3時までぐらいかな。

やっぱ、寝る。

//------------------------------
// mLocker
//------------------------------
// 2012/05/30
// Author : Martin Yara


// Create PPG

var oPSet = XSIFactory.CreateObject( "CustomProperty" );
oPSet.Name = "mLocker"

// Set PPG Parameters
oPSet.AddParameter2( "LockSclx", siBool,1);
oPSet.AddParameter2( "LockScly", siBool,1);
oPSet.AddParameter2( "LockSclz", siBool,1);
oPSet.AddParameter2( "LockRotx", siBool,1);
oPSet.AddParameter2( "LockRoty", siBool,1);
oPSet.AddParameter2( "LockRotz", siBool,1);
oPSet.AddParameter2( "LockPosx", siBool,1);
oPSet.AddParameter2( "LockPosy", siBool,1);
oPSet.AddParameter2( "LockPosz", siBool,1);
oPSet.AddParameter2( "LockLevel3", siBool,0);
oPSet.AddParameter2( "LockLevel7", siBool,0);
oPSet.AddParameter2( "LockLevelA", siBool,1);

// Set PPG Layout
var oLay = oPSet.PPGLayout;

oLay.AddGroup("", 0);
oLay.AddRow();
oLay.AddGroup("スケール", true, 25);
var oItem = oLay.AddItem( "LockSclx", "Scl X");
var oItem = oLay.AddItem( "LockScly", "Scl Y" );
var oItem = oLay.AddItem( "LockSclz", "Scl Z" );
var oItem = oLay.AddButton ("LockScl", "LOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
var oItem = oLay.AddButton ("UnLockScl", "UNLOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
oLay.EndGroup();
oLay.AddGroup("回転", true, 25);
var oItem = oLay.AddItem( "LockRotx", "Rot X");
var oItem = oLay.AddItem( "LockRoty", "Rot Y" );
var oItem = oLay.AddItem( "LockRotz", "Rot Z" );
var oItem = oLay.AddButton ("LockRot", "LOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
var oItem = oLay.AddButton ("UnLockRot", "UNLOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
oLay.EndGroup();
oLay.AddGroup("移動(位置)", true, 25);
var oItem = oLay.AddItem( "LockPosx", "Pos X");
var oItem = oLay.AddItem( "LockPosy", "Pos Y" );
var oItem = oLay.AddItem( "LockPosz", "Pos Z" );
var oItem = oLay.AddButton ("LockPos", "LOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
var oItem = oLay.AddButton ("UnLockPos", "UNLOCK");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
oLay.EndGroup();
oLay.AddGroup("LockLevel", true, 25);
var oItem = oLay.AddItem( "LockLevel3", "Anim");
var oItem = oLay.AddItem( "LockLevel7", "Value");
var oItem = oLay.AddItem( "LockLevelA", "All");
var oItem = oLay.AddButton ("LockAll", "LOCKALL");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
var oItem = oLay.AddButton ("UnLockAll", "UNLOCKALL");
oItem.SetAttribute( siUICX, 65);oItem.SetAttribute( siUICY, 18);
oLay.EndGroup();
oLay.EndRow();

oLay.EndGroup();

oLay.Logic = LockScl_OnClicked.toString()
+ UnLockScl_OnClicked.toString()
+ LockRot_OnClicked.toString()
+ UnLockRot_OnClicked.toString()
+ LockPos_OnClicked.toString()
+ UnLockPos_OnClicked.toString()
+ LockAll_OnClicked.toString()
+ UnLockAll_OnClicked.toString()
+ mUnLock.toString()
+ mLock.toString()
+ LockLevel3_OnChanged.toString()
+ LockLevel7_OnChanged.toString()
+ LockLevelA_OnChanged.toString()
+ FilterX3D.toString()
+ noLog.toString();
oLay.Language = "JScript" ;

InspectObj( oPSet,null,null,3 ) ;

function noLog(){
var prefs = Application.Preferences;
prefs.SetPreferenceValue( "scripting.cmdlog", false );
}

// GUI Functions ---------------------------
function LockLevel3_OnChanged(){
if (PPG.LockLevel3.Value == 1) {
PPG.LockLevelA = 0; PPG.LockLevel7 = 0
}
}
function LockLevel7_OnChanged(){
if (PPG.LockLevel7.Value == 1) {
PPG.LockLevelA = 0; PPG.LockLevel3 = 0
}
}
function LockLevelA_OnChanged(){
if (PPG.LockLevelA.Value == 1) {
PPG.LockLevel3 = 0; PPG.LockLevel7 = 0
}
}
//--------------------------------------------

function LockAll_OnClicked(){
LockScl_OnClicked();
LockRot_OnClicked();
LockPos_OnClicked();
}

function UnLockAll_OnClicked(){
UnLockScl_OnClicked();
UnLockRot_OnClicked();
UnLockPos_OnClicked();
}

function LockScl_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
if (PPG.LockLevel3.Value== 1) locklevel = 3
else if (PPG.LockLevel7.Value== 1) locklevel = 7
else if (PPG.LockLevelA.Value== 1) locklevel = null
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockSclx.Value==1) mLock (in_obj(i), "sclx", locklevel)
if (PPG.LockScly.Value==1) mLock (in_obj(i), "scly", locklevel)
if (PPG.LockSclz.Value==1) mLock (in_obj(i), "sclz", locklevel)
}
}
else{
logmessage ("You need to select an Object", siError)
}
}
function UnLockScl_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockSclx.Value==1) mUnLock (in_obj(i), "sclx")
if (PPG.LockScly.Value==1) mUnLock (in_obj(i), "scly")
if (PPG.LockSclz.Value==1) mUnLock (in_obj(i), "sclz")
}
}
else{
logmessage ("You need to select an Object", siError)
}
}
function LockRot_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
if (PPG.LockLevel3.Value== 1) locklevel = 3
else if (PPG.LockLevel7.Value== 1) locklevel = 7
else if (PPG.LockLevelA.Value== 1) locklevel = null
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockRotx.Value==1) mLock (in_obj(i), "rotx", locklevel)
if (PPG.LockRoty.Value==1) mLock (in_obj(i), "roty", locklevel)
if (PPG.LockRotz.Value==1) mLock (in_obj(i), "rotz", locklevel)
}
}
else{
logmessage ("You need to select an Object", siError)
}
}
function UnLockRot_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
if (PPG.LockLevel3.Value== 1) locklevel = 3
else if (PPG.LockLevel7.Value== 1) locklevel = 7
else if (PPG.LockLevelA.Value== 1) locklevel = null
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockRotx.Value==1) mUnLock (in_obj(i), "rotx")
if (PPG.LockRoty.Value==1) mUnLock (in_obj(i), "roty")
if (PPG.LockRotz.Value==1) mUnLock (in_obj(i), "rotz")
}
}
else{
logmessage ("You need to select an Object", siError)
}
}
function LockPos_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
if (PPG.LockLevel3.Value== 1) locklevel = 3
else if (PPG.LockLevel7.Value== 1) locklevel = 7
else if (PPG.LockLevelA.Value== 1) locklevel = null
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockPosx.Value==1) mLock (in_obj(i), "posx", locklevel)
if (PPG.LockPosy.Value==1) mLock (in_obj(i), "posy", locklevel)
if (PPG.LockPosz.Value==1) mLock (in_obj(i), "posz", locklevel)
}
}
else{
logmessage ("You need to select an Object", siError)
}
}
function UnLockPos_OnClicked(){
var in_obj = FilterX3D(selection)
if (in_obj.Count !=0){
if (PPG.LockLevel3.Value== 1) locklevel = 3
else if (PPG.LockLevel7.Value== 1) locklevel = 7
else if (PPG.LockLevelA.Value== 1) locklevel = null
for ( var i=0, a = in_obj.Count; i < a; i++ ) {
if (PPG.LockPosx.Value==1) mUnLock (in_obj(i), "posx")
if (PPG.LockPosy.Value==1) mUnLock (in_obj(i), "posy")
if (PPG.LockPosz.Value==1) mUnLock (in_obj(i), "posz")
}
}
else{
logmessage ("You need to select an Object", siError)
}
}


function mUnLock(obj, srt){
switch (srt){
case "sclx": if (obj.kinematics.Local.sclx.Locklevel != 0 ) obj.kinematics.Local.sclx.UnSetLock(); break;
case "scly": if (obj.kinematics.Local.scly.Locklevel != 0 ) obj.kinematics.Local.scly.UnSetLock(); break;
case "sclz": if (obj.kinematics.Local.sclz.Locklevel != 0 ) obj.kinematics.Local.sclz.UnSetLock(); break;
case "rotx": if (obj.kinematics.Local.rotx.Locklevel != 0 ) obj.kinematics.Local.rotx.UnSetLock(); break;
case "roty": if (obj.kinematics.Local.roty.Locklevel != 0 ) obj.kinematics.Local.roty.UnSetLock(); break;
case "rotz": if (obj.kinematics.Local.rotz.Locklevel != 0 ) obj.kinematics.Local.rotz.UnSetLock(); break;
case "posx": if (obj.kinematics.Local.posx.Locklevel != 0 ) obj.kinematics.Local.posx.UnSetLock(); break;
case "posy": if (obj.kinematics.Local.posy.Locklevel != 0 ) obj.kinematics.Local.posy.UnSetLock(); break;
case "posz": if (obj.kinematics.Local.posz.Locklevel != 0 ) obj.kinematics.Local.posz.UnSetLock(); break;
}
}

function mLock(obj, srt, locklevel){
if (locklevel==null) locklevel = siLockLevelAll
switch (srt){
case "sclx": obj.kinematics.Local.sclx.SetLock(locklevel); break;
case "scly": obj.kinematics.Local.scly.SetLock(locklevel); break;
case "sclz": obj.kinematics.Local.sclz.SetLock(locklevel); break;
case "rotx": obj.kinematics.Local.rotx.SetLock(locklevel); break;
case "roty": obj.kinematics.Local.roty.SetLock(locklevel); break;
case "rotz": obj.kinematics.Local.rotz.SetLock(locklevel); break;
case "posx": obj.kinematics.Local.posx.SetLock(locklevel); break;
case "posy": obj.kinematics.Local.posy.SetLock(locklevel); break;
case "posz": obj.kinematics.Local.posz.SetLock(locklevel); break;
}
}

function FilterX3D(in_Objs){
var inCol = XSIFactory.CreateObject('XSI.Collection');
var outCol = XSIFactory.CreateObject('XSI.Collection');
inCol.unique = true;
inCol.items = in_Objs;
var oExp = inCol.Expand();
for (var i=0, a=oExp.count; i < a; i++) {
if (oExp(i).IsClassOf(siX3DObjectID)) outCol.Add(oExp(i))
}
return outCol;
}

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/127-9cf27eec
Use trackback on this entry.

まとめtyaiました【SI | mLocker キネマティックスロック】

今日は Diablo 3 のサーバには入れなくて、とりあえずTwitterを開いて見ていたら LandYさんは Lock をスクリプトでやりたいみたいなことをつぶやいていました。確かに何ヶ月前にそのような

  • 2012/05/30(水) 05:32:35 |
  • まとめwoネタ速neo