VmdScript 

KV[pȂ̂ŗp͒!!


VmdScriptƂ́H

[Vf[^vOC^XNvg쐬@\̑̂łB

ScriptƂ܂͓ȓƎXNvgɂ̂ł͂ȂA
.NETt[[NɂʓIȃNXȂ̂ŁAΉvO~O舵\łB

̋@\͑̃vOC@\ƓlɃC^[tFCX̎gpƂȂ܂B

.NETt[[N̊eΉꂩgƂł܂Aȉ̐ɂĂC#ł̋Lq{ƂĂ܂B

dlł܂ĂȂ̂ŁAXNvg(CSScriptvOC)ƂĂ̎gp𐄏B




VMDVME

VmdScript VMD(IPEVmd) y VME(IPEVme) Ƃ2ނ̈قȂdl\Ă܂B

VMD : IPEVmd
MMDVmd`ɂdlB
{[^\^J^ƖꂼꋤʃXgňꊇǗAMMD̃L[zuƓl̒lf[^ƂĎ舵`B

VME : IPEVme
Ǝ̃[VdlB
ʂ̃Cxgo^ɂl^x^x䂪\BGȋOȂǂȈՂɋLq邱Ƃł܂A
ʃ_Ȃǂ̋LqKvɂȂ̂Ōdlւ̊ꂪKvɂȂ܂B

VMDɂ͂Ȃ{[̃XP[ωȂǂ\iꕔ@\^XP[ωVmdt@Cւ̏o͂͂łȂ̂ŁAVMDViewł̊mF^fo͂̂݁j

VMEɂsʂ Result`(IPEVmeResult) oRVMD֏o͉\ł(VMDɂVME邱Ƃ\)
{I VME  VMD ̏ʌ݊̎dlƂȂ܂B




VMD(IPEVmd)̎g

//r_쐬
IPEVmd vmd = PEStaticBuilder.SC.Vmd();

//PMDŏ
vmd.Init(pmd);		// IPEPmd pmd = args.Host.Connector.Pmd.GetCurrentState(); Ȃ

//Cӂ̃{[L[쐬
IPEVmdBoneKey boneKey = PEStaticBuilder.SC.VmdBoneKey();

boneKey.FrameIndex = 0;		// 0t[
boneKey.BoneIndex = 0;		// 擪{[
boneKey.Translation = new V3(0,5,0);	// 5ړ
boneKey.Rotation = new Q(5,5,5);	// XYZ5xÂ]

// L[ǉ
vmd.Bone.Add(boneKey);

// VMDt@C֕ۑ
vmd.ToFile(path);	// path = @"C:\test.vmd"; Ȃ


ƂŁA{[(Bone)A\^[t(Morph)AJ(Camera)AƖ(Light)ꂼɃ[VL[ǉA
VMDt@C֏o͂邱Ƃ\łB

܂A
args.Host.Connector.View.PMDView.BootupVmdView(pmd, vmd);
ƁAVMDViewŒڃvr[sƂ\łB

VMDƈقȂ镔́A{[^[t̊eL[ł͖̂ł͂ȂIndexlɂĎw肷邱ƁB
̂߂ɗ\VMD𖼏̂Index̊֌WŏĂKv܂iPMD̏ or êŏj

IWiVMDf[^̊eL[ɂ͑SđΉ閼̂i[Ă܂AǗf[^ʂȂ̂Ől(Index)֕ύX

ɂVMDt@C珉邱Ƃ\łiIPEVmd.FromFile(string path)j


VMDɊi[\ȃL[` 

ڍׂɂĂVisualStudiõIuWFNguEUȂǂvOC@\QƂĂB

O : PEPlugin.Vmd

{[(Bone)        : IPEVmdBoneKey
\^[t(Morph) : IPEVmdMorphKey
J(Camera)      : IPEVmdCameraKey
Ɩ(Light)         : IPEVmdLightKey
ZtVhE      : IPEVmdSelfShadowKey

̃L[ɔCӂ̃t[lƊelݒ肵ΉXg֒ǉ邱ƂŁA[Vf[^쐬邱Ƃ\łB

J^ƖpMMDł͓̃fɂĂKv܂(VMDViewŎgꍇ͊֌WȂ)
  void SetModelNameForCameraLight();  // ۑ(ToFile())OɌĂяoKv


VMD̒lݒɂ

VMD(IPEVmd)̊el(xNg^]ʂȂ)PMXGfB^̃vOCƓA
IPEVector3  IPEQuaternion ł̎舵ɂȂĂ܂B

͎̂Ȃ舵ɖʓ|Ȃ̂ŁAʓISlimDXƂ̑݉^p\ȃNXIuWFNgĒlݒsƂ𐄏܂B

IPEVector3 <> V3 <> Vector3
IPEQuaternion <> Q <> Quaternion
ȂǁB

ڂ CSScriptvOC"CSScript.txt"ɋLqĂ܂B

܂ȉVMEł̎舵ɂĂȂ݉^pNX̋@\z肵̂܂܂܂B






VME(IPEVme)̎g

//r_쐬
IPEVme vme = PEStaticBuilder.SC.Vme();

//PMDŏ
vme.Init(pmd);		// IPEPmd pmd = args.Host.Connector.Pmd.GetCurrentState(); Ȃ

// 擪{[ɃCxgݒ
vme.Bone[0].T.Set(0, new Vector3(0,5,0));  // 5ړ
vme.Bone[0].R.Set(0, new Q(5,5,5));        // XYZ5xÂ]

// VmdViewŃvr[
vme.Preview();

܂́A

// Cxgs
IPEVmeResult result = vme.Run();

// ʂ[VVmd֕ۑ
result.ToMotionVmd().ToFile(path);	// path = @"C:\test.vmd"; Ȃ


ƂŃ[V쐬邱Ƃł܂B
VMDƔrāA

EL[PʂŒlݒ肷KvȂ
EړƉ]ȂǁAep[^l𕪗ĊǗ邱Ƃ\

Ȃǂ̓܂B
VMD̂悤Ƀt[Ԃ̒lvZ()dlł͂Ȃ̂ŁA̕ω[U[ŊǗKv܂B


VMEŗp\ȃIuWFNg

O : PEPlugin.Vme

{[(Bone)        : IPEVmeBone
\^[t(Morph) : IPEVmeSingleValueElement
J(Camera)      : IPEVmeCamera^IPEVmeCameraPosition
Ɩ(Light)         : IPEVmeLight
ZtVhE      : ps

̓CxgvfC^[tFCX(IPEVmeEventElement) hAVMECxgƂČXɊǗĂ܂B

eIuWFNg̒lݒ̓vOCƈقȂASlimDX̒l^(Vector3QuaternionȂ)̂܂ܗp܂B
̂ߊOvOCoRō쐬ꍇ́APMXGfB^t"SlimDX.DLL"QƃAZuƂđgݍޕKv܂(Yt͕sv)



CxgǗɂ闘_

Ⴆ30t[ʒu(1b)̐擪{[ɂ̂Ƃ̃J̕ꍇA
L[ɂ鎖Oo^ł͗\1b̃JʒuvZĂKvA̕Ǘ̌nώGɂȂ܂B

΂ăCxg쓮^̏ꍇAJȂǑ̃IuWFNg̏ԂɊ֌WȂA
u30t[ɂȂ炻̒l擾̕֌ςv
Ƃw肪\ɂȂAyɃIuWFNgm̘Agł悤ɂȂ܂B

̓IɏL̃p^[́A

// 擪{[30t[ʒuɉ]ʓo^
vme.Bone[0].R.Set(30, (IES state) =>
{
    IBS s = state as IBS;    // ԕϐ{[pɕύX(IES:IPEVmeEventState^IBS:IPEVmeBoneState ꂼ̃GCAX)
    return Q.Dir(vme.Camera.GetCameraPos() - s.P.PV);    // ݂̈ʒu->Jʒuւ̃xNg()Ɍw
});

ƂɔɊȌɋLq邱Ƃ\ł(ۂ̉^pł͕KvɂȂp[^ݒ(IDȂ)ȗĂ܂)

ɋl߂ď΁AsłLq\(Ql)
vme.Bone[0].R.Set(30, (IES state) => Q.Dir(vme.Camera.GetCameraPos() - (state as IBS).P.PV));


܂LCxgݒ͔ėp`ƂĉL̂悤ɋLq邱Ƃ\łB

vme.Bone[0].SetEvent(30, (IES state) =>
{
    IBS s = state as IBS;
    s.R.Set(Q.Dir(vme.Camera.GetCameraPos() - s.P.PV));   // ݂̏ԕϐ(])ύX
});

ۂ͂̉^p@ʓIȗp@(ǂ̃IuWFNgł)ɂȂ܂A
֐ɍ킹Ă̐ݒ@I邱Ƃ\łB


ACxg쓮̋Lqɂ́A_fQ[g@\i֐|C^̔ėp`jKvɂȂ̂ŁA
pɂ͌dl(.NETt[[N^C#)𑽏ĂKv܂B

.NETt[[NeventoRĂȂ̂͋LqʓI(object sender)ȂǂʂȂ̂ŁB



x^xݒ

ړʁ^]ʂȂǂ͌ݒl̒ڐݒȊOɁAx^xݒ肷邱Ƃ\ɂȂĂ܂B
ړⓙ]A܂ړ^]ȂǂɂȈՂɋLq邱Ƃł܂B

F葬xł̉]
vme.Bone[0].R.SetV(0, new Q(0, 5, 0));

Y5x^t[̑xŉ](̕ω^ʒu͕ςȂ)


ɂelݒł͌ݒlւ̃ItZbg(Z^ώZ)w\Ȃ̂ŁA
ɂ[Iɑx^xIȓ𑣂Ƃ\łB

F݈ʒuXɈړ
vme.Bone[0].T.Set(0, 120, new Vector3(0, 1, 0), OpType.Add);   // OpType.Add : ݂̈ړʂɃItZbgZ

0-120F(4b)+1^t[̑xŏ㏸


x^x̎ԒPʂ̓t[BIɂ̓t[Ɍݒl⑬xl֒PZ(ώZ)sĂ܂B

ړʂ]ʂ́Aݒl^xl^xlꂼʂɎĂ̂ŁA
K؂ɊǗ邱ƂdvɂȂ܂B

ႦΐÎ~邽߂ɑx0ɖ߂Ăx0ɖ߂ĂȂꍇAÎ~邱Ƃɂ͂Ȃ܂B


xNgl̑x^xwɂ͍sgƂ\łB
s𗘗p邱ƂŁA{[_Sɉ]ړȂǁA񒼐n̉^Lq邱Ƃł܂B

F]^
vme.Bone[0].T.SetV(0, M.RotM(new Vector3(5, 0, 5), Vector3.UnitY, Q.D2R(15)));

(5,0,5)𒆐S_ƂāA݈ʒuY15x^t[ŉ]^i{[͈̌̂܂܁j

L̏ꍇ{[̊ʒut[ɕω肷ƁA\zƂ͈قȂOɂȂ邱Ƃ܂BӂB



ԕϐ  Cxgϐ

VMẼCxg\ł͓o^ꂽCxgA

1. ԕϐʂĊeCxgƂ
2. CxgɂύXꂽʂo

Ƃ`ŏs܂B

ꂼ̃Cxg͏ԕϐ(IPEVmeEventState(IES)h)ČĂяosA
Cxgł̏ԕϐXV邱ƂŁA[VʂƂďo͂邱Ƃł܂B

Ⴆ΁A{[̏ԕϐł IPEVmeBoneState(IBS) ̃p[^́A

@IPEVmeVectorValue T { get; }     // T : ړ
@IPEVmeQuaternionValue R { get; } // R : ]
@IPEVmePosition P { get; }        // P : ʒu
@IPEVmeDirection D { get; }       // D : 
@IPEVmeScale S { get; }           // S : XP[

ƂȂĂ(Zn̂ݗ)AړʂȂl(ݒl):PV^x:V^x:A ɕێĂ̂ŁA
Cxgŏ邱ƂɂȂ܂B

ň舵܂킵̂܂B

Cxg̓o^ɂ͎ɃCxgϐčs킯łA
Ⴆ΁A{[̎ȃCxgϐ͈ȉ̂悤ɂȂĂ܂(Zn̂)

@IPEVmeVectorValueEventOperator T { get; }     // T : ړʃCxgݒ
@IPEVmeQuaternionValueEventOperator R { get; } // R : ]ʃCxgݒ
@IPEVmePositionEventOperator P { get; }        // P : ʒuCxgݒ
@IPEVmeDirectionEventOperator D { get; }       // D : Cxgݒ
@IPEVmeScalingEventOperator S { get; }         // S : XP[Cxgݒ

ĉƂԕϐƃCxgϐł́AC^[tFCXΏۂ͈قȂ܂ê͋ʂ̂̂ɂȂĂ܂B

{[猩ƁA

bone.BS.T...   // ԕϐT
bone.T...      // CxgϐT

ƈقȂKwɂȂ܂A͔ɂ܂킵̂łӂ(̃IuWFNgłlł)

{Iɏԕϐ̓Cxg̎gpɌ肵ĂƂ𐄏܂B


܂ԕϐ̊el͑\lƂ`ŌݒlʉĂ܂B

 ***(^).PV "PV"(܂"PrimaryValue")Ƃ̂ɂȂĂ܂B

ꕔ\l̃p[^ƌpɂȂĂ̂܂A
"PV"Ȃǂ̃p[^(vpeB)A܂Get()^Set()֐擾^ݒ肷邱ƂʉĂ܂B


Aeݒl̓CxgOłݒ^擾͉\łAeyڂȂ̂łӂB

F
vme.Bone[0].BS.T.Set(Vector3.Zero);

CxgOł̌ĂяoȂ̂ŉeȂ

vme.Bone[0].SetEvent(0, () => vme.Bone[0].BS.T.Set(Vector3.Zero));

0t[̌ݒl(Cxg瑀삵Ă̂ŉe)

̉pƂāAʃIuWFNgւ̋Ȃǂ\łǗȂ̂ł܂萄͂܂B



CxǧĂяoID

VMEɓo^ꂽCxǵAID

(Jn)
@
[t:Index
@
{[:Index
@
J
@
 Ɩ
@
<IDcĂ>擪֖߂遪
@
(I)

ƂŃt[Ɏs܂B

قƂǂ̏ꍇftHgID=0(ȗ\)œo^ΖȂ삵܂A
ႦIndex̌̒̕lQƂꍇÃt[ł̃JʒuȂǂ{[QƂꍇȂǂ́A
Cxgo^ ID=1 Ȃǂw肵Asx点Kv܂B

F
vme.Bone[0].SetEvent(0, (IES state) => (state as IBS).T.Set(vme.Bone[10].BS.T.PV), 1); // 1ID

擪(0){[̈ړʂ̃t[10ԃ{[̒lݒƓɂCxgݒ(ID=1)



Cxg̃Cxgo^

VME̎dlACxgĂяoVɃCxgo^邱Ƃ͉\łA
̂悤Ȏg͐܂BقƂǂ̏ꍇĂяosȂ\Ǝv܂B

܂sJñCxgɑ݂ȂID̃CxgǉĂlɌĂяo͍s܂B

Cxg͊JnɊmł̂ƂĎs邱ƂOƂĂ܂B

̎dl͍ύXɂȂ邩܂()



Z(V[gJbg)ɂ

VME֘ÃIuWFNgɂ"****(Z)"ƂAO̔ɒZvpeBϐ֐݂܂B

̓XNvgł̋Lqz肳ꂽV[gJbg(GCAX)ƂĎĂ܂B
ꂼɂ͈Ӗ̉Zn̒̂̕ϐ^֐zuĂ̂ŁA킹ĊmFĂB

FIPEVmePrimaryValue<TValue>  // el̊C^[tFCX 
  TValue PV { get; set; }           // \l(Z)
  TValue PrimaryValue { get; set; } // \l

ʂ猩ƁAZnZnƖ̂̒Zn̕ĂяôŁA
V[gJbg(GCAX)̕ϐ^֐ł̗p܂(IPEVmePrimaryValueȂ"PrimaryValue"ł͂Ȃ"PV"̎gp𐄏)


܂CxgϐȂǂ悭gC^[tFCX̓GCAX쐬ĂƋLqyɂȂ܂B

CSScriptvOCł͉L̃GCAXO`ĂA{hLgɏĂ܂B

// GCAXꗗ
using IES = PEPlugin.Vme.IPEVmeEventState;
using IBS = PEPlugin.Vme.IPEVmeBoneState;
using ISS = PEPlugin.Vme.IPEVmeSingleValueState;
using IMS = PEPlugin.Vme.IPEVmeSingleValueState;
using ICS = PEPlugin.Vme.IPEVmeCameraState;
using ILS = PEPlugin.Vme.IPEVmeLightState;



l^vpeBւ̑

dlƂĂ̒ӓ_łB

ԕϐ̊eĺAVector3QuaternionAMatrixƂ\(l^)ւ̃vpeBƂȂĂ܂B

Fʒȕꍇ
Vector3 P { get; set; }

ʏ X ̂ݒlύXꍇȂǁA

vme.Bone[0].SetEvent(0, (IES state) =>
{
    IBS s = state as IBS;

    s.P.PV.X = 10;   // X̂ݒlݒFG[I
});

ƋLqĂ܂܂A̓G[ƂȂ܂iɃG[\LɂȂȂꍇłɓ삵܂j

C#ł̍\̂͒l^Ȃ̂ŏĹA

vme.Bone[0].SetEvent(0, (IES state) =>
{
    IBS s = state as IBS;

    s.P.PV = new Vector3(1, 0, 0);    // X,Y,Z킹Đݒ肷Kv

    // X̂ݕύXꍇ
    Vector3 v = s.P.PV;  // UϐoR
    v.X = 10;            // ϐΌʂɐݒ\
    s.P.PV = v;
});

Ƃ悤ɒlƂĐݒ肷Kv܂B
C++o҂Ȃǌdl̈Ⴂ獬\̂łӂB

]kłvOC IPEVector3  ݉^p V3 Ȃǂ̓NX(Qƌ^)ƂȂĂ̂ŁA
L̂悤X݂̂̕ύXȂǂɋ@\܂B



{[ƕό`\

VMEǗ̃{[͌ɂȂό`\ɂĈقȂ铮s܂B

܂VMȄłA

@void Init(IPEPmd pmd = null);

֐̌Ăяopmdnullɂꍇ(ȗłl)APMD[hƂċ@\܂B

̏Ԃł́A

@IPEVmeBone AddBone(string name, Vector3 pos);  // {[̒ǉ
@void RemoveBone(IPEVmeBone bone);              // ǉ{[̍폜

Ƃ{[̒ǉn\ɂȂÃ{[͓Ɨړ^]\ȃ{[ƂĎ舵܂B
{[̐eq֌WIK܂ޓ̍\ό`ȂǂsƂ͂ł܂B

΂āA֐pmdp[^ɔCӂPMDw肵ꍇA
VMẼ{[͌PMDɏ]ό`\悤ɂȂ܂B

̏ԂŃ{[̒ǉnĂяoƗOI
[tlPMDԂɂǉ\^s\ω


ό`\ꍇA{[p[^

ʒu(P:IPEVmePosition)^(D:IPEVmeDirection)^O[oXP[(S.GS:IPEVmeScale)

̊el̎擾^ݒ莞ɕό`ԂƂ̐s܂B̓Iɂ݂͌̃{[Ԃŕό`ԂXV܂B
f`ɂ܂ό`͔rIdȂ̂ŁALO[on̒lgꍇ͒ӂKvɂȂ܂B

݂̎dlł̓XP[l{ɂȂĂȂꍇAXP[Ȃǂ@\Ȃ͗l()

ړs{[Ɉړʂݒ肵ꍇAό`ԂƓlȂȂƗ\z܂B



O[oƃ[J

{[̏ԕϐɂ́A

T : ړ   | Translation
R : ]   | Rotation
P : ʒu     | Position
D :      | Direction
S : XP[ | Scale (GS:O[oXP[)

ƁA̒li[Ă܂A

[Jl   : T, R, S
O[ol : P, D, (GS)

ƕނ܂B

[Jl̏ꍇÃ{[(IuWFNg)ƂWnŉZs܂B
X,Y,Z̒lݒł(eIuWFNg̕ό`Ȃǂɂ)ƂȂWn]ĂȂǂŁA
O[o̍WnƂ͈قȂŉ^邱ƂɂȂ܂B

x^x̓ItZbgwɂȂ̂ŁAʓIɃ[Jɂ܂B
Wn̂Ȃǂɂ҂Ă^ɂȂȂꍇ܂B


ӓ_ƂāAԕϐ̒l [Jl ێłȂ̂ŁAO[olꍇ
֘A[JlꏏɏĂAƂƂ𗝉Kv܂B

FʒuP
P   tZT̒l

܂ό`\ĂPMDfΏۂ̏ꍇAO[ol擾^ݒ肷Ƃɖό`Ԃ̍XVŝŁA
̃IuWFNg舵ꍇȂǂ́AUϐɊi[Ȃǂ̑ΉKvɂȂ܂B

O[o<>[JԂ̕ϊ͎Iɍs܂Aό`\XP[Ȃǂ̏󋵂ɂĐ@\ȂƂ܂()



J̈Ⴂ

MMD(VMD)̃J

Position : _ʒu
Angle    : J
Distance : _܂ł̋

Ƃ1_̈ʒuƌAyыŕ\L܂A
ɑ΂VMẼJ

Position : Jʒu
Target   : J_
Up       : J̏

Ƃ2_Əŕ\܂Bꂼړʂƈʒu(ʒu=_)ݒ肷邱Ƃ\łB

3DCGłViews(LookAtL(R)H)ł͂悭g`łB

{IɈʒu񂾂Ŏ舵\Ȃ̂ŁA{[\̎ʑȂǂrIeՂɍsƂłƎv܂B
R̂ƂȂA{[Ɠړʂ瑬x^xsƂ\łB



vr[@\ƌʃf[^(IPEVmeResult)ɂ

VMEVMDViewgĂ̂܂܃vr[邱Ƃ\łB

@bool Preview(IPEPmd pmd, PEVmePreviewOption option = null);  // CӂPMDgăvr[
@bool Preview(PEVmePreviewOption option = null);              // PMD珉ꍇ͂OK

̏ꍇAVMDView͐p̃Cxgs[hƂē삵܂B

܂ŏɓo^ꂽCxgi߂Ȃe̕ό`ԂL^Ă܂B
Ō܂ŊƋL^ꂽlĐ\ɂȂ܂B

ɂ萔Pʂ̃IuWFNgłA^Cvr[\ɂȂ邱Ƃ܂(ׂɂĂ͎sɂ܂)

̃[h30FPSŒAZOFFɂȂ܂BʏVMDViewƂčĐꍇ͈UVMD֕ϊKv܂B

ARun()s IPEVmeResult vr[sƂ\łAVMẼvr[Ɠ`ɂȂ܂B

VME̎sʂ(vr[Ȃꍇ)Uʃf[^(IPEVmeResult)Ɋi[܂B
璷Ȏdlɂ܂AɂoVMD̐U蕪AUsVMEʂ̍ėpȂǂ\ɂȂ܂B

ʃf[^̕ҏW֘A@\͖B̎dl͈ꊇăf[^擾łȂ̂ŁAH͌@ɂȂ邩Ǝv܂B



VMDVMȆ݉^p

VMD : VMDIuWFNg̍쐬vmdt@Cւ̓o͂\łB

VME : ȉ̏Hłꂼϊ邱Ƃ\łB

  Vmd  Vme       : void SetVmd(IPEVmd vmd);    // St[VMDf[^Cxgo^܂

  Vme  VmeResult : IPEVmeResult Run();

  VmeResult  Vmd : IPEVmd ToMotionVmd(bool preSkip = false); 
                     IPEVmd ToCameraVmd(bool preSkip = false, bool margin = false);
                     IPEVmd ToLightVmd(bool preSkip = false);

  VmeResult  Vme : void SetVmeResult(IPEVmeResult result);  // St[o^


ʓI

VMD  VME  VmeResult  (VMD  ...)

ƂɂȂ܂B



VMDo͎̐ɂ

VMEVMDViewœƎɊgꂽp[^lVMD֏o͂ł܂B̓Iɂ̓{[̃XP[ȂǂɂȂ܂B

VME̎sʂ͑St[̓o^L[ƂȂ܂B
̂ vmdt@C̐L[𒴂f[^o͂Ă܂\܂B

ꗗ
{[ : 30(10قǂłȏԂĂȂȂ̂ŁAxpE)
\   : 2
J : 1
Ɩ   : 1


VMDo͎MMDł"svL[폜"Ɠ̏s܂A
ႦΓړȂǂłSt[ɃL[zuĂ܂̂(MMD̎dlł2_ŏ\)A
𒴂Ă܂Ȃ悤ӂKv܂B

ȏ̃L[ƂȂĂx\Ȃǂ͂܂BȂ݂ɂ̐ȏVMDłVMDViewł͓ǂݍ݉\łB

]kłAMMDł̐ȏ̃[V𗘗pɂ́A

1. ͈͓Ɏ܂悤VMD𕪊o
2. ꃂf𕡐ǂݍVMDꂼɔzu
3. svȕ̃f\

Ƃ􂪕KvɂȂ܂BMMDł͐L[PʂVMD̓ǂݍ݂͔ɎԂ邱Ƃ̂łӂB



O[v

{[⃂[tȂǑʂ̃IuWFNgxɈꍇȂΏ۔͈͂𓯈Iɐ䂵ꍇȂǂ
O[vĎ舵Ƃ\łB

IPEVmeEventElement ΏۂȂ̂ŁAJƖȂǂꉞǉ\łAprƂĂ͂܂Lpł͂ȂƎv܂B

AVME͏ԂŃ{[yу[tɂđSĂ̑ΏۂO[vƂďĂ܂B
 vme.GroupBone y vme.GroupMorph

O[vIuWFNg

vme.GroupBone.ForEach((IPEVmeBone bone) =>
{
    bone.P.Set(0, V3.Rand(-50, 50));  // xyz:-50`50͈͂Ƀ_zu
});

ƁAO[vxɐݒ\ł (IndextŃCxgݒ肷邱Ƃ\)


Ȃ݂ɏL͈ȉƓ`ŃR[hʂ܂ς܂񂪁A
̑Ώ۔͈͂ȂǂO[vƂĎ舵ꍇȂǂɂ͗Lpȕ@ɂȂ܂B

// ʓIȕΏۂւ̓o^@
for (int i = 0; i < vme.Bone.Count; i++) {
    vme.Bone[i].P.Set(0, V3.Rand(-50, 50));
}



ԃpX

pXoH쐬@\łBIPEVmePath Ƃp̃C^[tFCX쐬\łB

C^[tFCX PEStaticBuilder.SC.VmePath() Ȃǂ쐬\B

ԌoH͎w̐ߓ_𕡐ǉĂƂō邱Ƃł܂B
PMDf̃{[Ⓒ_Ȃǂ𗘗p邱Ƃ\łB

쐬ꂽoHACӂ̑x^xω^t[ɑ΂oHʒuŁA
̌oHʂt[̍W擾\A
ɈʒuCxgϐCxg֓o^\ł({[^J)

oH́A܂͋Ȑ(݂̓XvĈ)I邱Ƃł܂B

ʒu̍ZoACxgϐփCxgo^@\LĂ܂B

̋@\܂gݍ킹邱ƂŊȈՂȋԋOyɍ쐬邱Ƃł܂B
PMXGfB^̃{[쐬@\ƕpΎoIȍ쐬\ɂȂ邩Ǝv܂B




Ȃ

ԕϐ̕ϊXʓ|

Cxgo^ł͑̂ɂ

IBS s = state as IBS;

Ȃǂ̕ϊ̋LqXKvɂȂAɏ璷Ǝv܂B

WFlNX@\pȂǂĂ݂܂A
fQ[gEC^[tFCXENXƑSĂׂݒɓ̂H܂łȂ̂ŁA
C^[tFCXł IPEVmeEventState oRdlƂĂ܂B

Xʓ|łÂ悤Ȃ̂ƂČ󂲗𒸂v܂(܂łꍇ͎dlύX邩܂)


Z

VME͕ZɑΉĂ܂Bvr[IɕZOFFƂȂ܂B

Zg[V쐬ꍇ́AUVMD֕ϊKv܂B

VMDViewłVMDL[Ȃǂ̐rIɂ₩łAMMDł̓{[L[30^\L[2ƂȂ̂
̃IuWFNg̎舵͓Ǝv܂iVMEϊVMD͑St[o^nƂȂ̂Łj

IɑΉ\͂邩܂񂪁A܂҂Ȃ悢Ǝv܂B


JƎs

K͂rI傫ȂĂ܂̂ŁAJ̓CeZXx@\g VisualStudio(VS2010ȍ~) ȂǂłA
XvOCĎŝ͔ɖʓ|Ȃ̂ŁAsɂĂCSScriptōsyɂȂ邩܂B

{VSォĂяo\ȊOs@\ĂłA
.NETAZu̎dlA[h܂Ȃ悤Ȃ̂(ɂ͎dl̑啝ȕύXKvɂȂ͗l)A

XcȎgłAVSCSScript̕prI]܂悤łB

CSScriptłȂƂ͂܂񂪁AR[h̋Lq⃊t@X̎QƂȂǂɂȂ邩Ǝv܂B


Tvɂ

CSScriptvOCɑ̃TvXNvgYtĂ܂B
TvɂȂĂȂ܂񂪁EEE

vg^Cv𗘗pč쐬͈̂ȉ̂悤ɂȂ܂B
http://www.nicovideo.jp/watch/sm11853319
http://www.nicovideo.jp/watch/sm11569284

Ȃ݂ɊJ(Core2-E6600^GF9800GT)ł́A3xBOXIuWFNg(72_)łA
VMDView̃vr[30FPSŉ\ł(ɂ100`200FxEł)








