DirectX 8.1b Rysligt snurrig kod... man blir ju blind... Nä, det jag vill rotera är Main3d men items3d ska följa efter.. Det jag ska ha är en bil.. Och jag har en bottenplatta som är main3d och kordinationerna för mitten på den plattan har jag.. Och så kan vi säga att Items3d är ett hjul som ska hålla sig en bit ifrån mittenplattan så att det kommer i hjulhuset om man så säger.. Och om jag roterar main3d så ska hjulet vara på samma plats iaf.. Det är ju det jag skrev, fast åt andra hållet. Det vore toppen... Ojsan... lessen att jag glömde att svara. Jag gör lite antaganden här, så får du anpassa det efter ditt problem. Jag får det ändå inte att funka... Fast det kan ju iof bero på att jag gett upp hoppet med detta och glömt bort allt jag gjort och hur det funka... Jag fick ett iMail med i stort sett samma innehåll som posten ovan, och det här är en del av det iMail jag skickade som svar:Ett objekt som följer ett annat!
Jag har stora problem med matte.. Det här är säkert ett jättelätt problem.. Men jag behöver hjälp med att räkna ut hur jag får ett objekt att hålla sig till ett annat oavset hur man roterar det första..
Man kan helt enkelt kan man säga att jag behöver en x fil som håller sig till en annan x fil.
Items3D(4).Mesh.Pos.X = Main3D.Mesh.Pos.X + (Sin(Main3D.Mesh.ConvAngle) * (Items3D(4).PosX * Cos(Main3D.Mesh.Rotation))) - (Cos(Main3D.Mesh.ConvAngle) * (Items3D(4).PosZ * Cos(Main3D.Mesh.Rotation)))
Items3D(4).Mesh.Pos.Z = Main3D.Mesh.Pos.Z + (Sin(Main3D.Mesh.ConvAngle) * (Items3D(4).PosZ * Cos(Main3D.Mesh.Rotation))) - (Cos(Main3D.Mesh.ConvAngle) * (Items3D(4).PosX * Cos(Main3D.Mesh.Rotation)))
Items3D(4).Mesh.Pos.Y = Main3D.Mesh.Pos.Y - (Sin(Main3D.Mesh.Rotation) * Items3D(4).PosX + Items3D(4).PosZ + Items3D(4).PosY)
Så ser kåden ut som jag har fått hittils att funka.. Men nu behöver jag klämma in Pitchen.
Hmm, finns inget forum för DirectX..Sv: Ett objekt som följer ett annat!
<code>
With Main3D.Mesh
Items3D(4).Mesh.Pos.X = .Pos.X + (Sin(.ConvAngle) * (Items3D(4).PosX * Cos(.Rotation))) - (Cos(.ConvAngle) * (Items3D(4).PosZ * Cos(.Rotation)))
Items3D(4).Mesh.Pos.Z = .Pos.Z + (Sin(.ConvAngle) * (Items3D(4).PosZ * Cos(.Rotation))) - (Cos(.ConvAngle) * (Items3D(4).PosX * Cos(.Rotation)))
Items3D(4).Mesh.Pos.Y = .Pos.Y - (Sin(.Rotation) * Items3D(4).PosX + Items3D(4).PosZ + Items3D(4).PosY)
End with
</code>
Är en förbättring...
Sen är jag inte helt säker på att jag förstår frågan... Vill du rotera ett objekt ("Items3D(4)"), och ha ett annat objekt som "sitter fast" i det första objektet?
Det du får göra är i så fall att rotera det andra objektet på precis samma sätt och runt samma axel som det första. Nu hajar jag inte riktigt koden där uppe, så du får berätta runt vilken axel du roterar. En axel parallell med y-axeln förstår jag, men inte riktigt hur.Sv: Ett objekt som följer ett annat!
Rotationen ska funka med alla axlar hur som helst.. Hur jag än roterar Main3d så måste Items3d vara på exakt samma position.. Helt enkelt så ska det sitta fast på ett speciellt ställe om man så säger..
Fan vad jag är värdelös på att förklara..Sv: Ett objekt som följer ett annat!
Det du får tänka ut är: Du har en godtycklig punkt i main, och du har tre vinklar. Sen vill du relatera en punkt i ett annat objekt till detta. Objektet skall vara roterat på samma sätt som main. Positionen hos objektet beror på rotationen och translationen hos "main"
Har tyvärr inte tid att kolla det nu... kan återkomma om du inte löser det.Sv: Ett objekt som följer ett annat!
Jag har hållit på i över en vecka nu.. Fått till det med två av vinklarna men med den tredje kör det ihop sig... Att rotationen ska vara den samma det har jag förstått men positionen är det svårare med..
Vore mycket tacksam för lite hjälp!Sv: Ett objekt som följer ett annat!
1. Mitten på bottenplattan har koordinaterna (0,0,0)
2. Du kan rotera på tre sätt, runt x-axeln, y-axeln och z-axeln. Rotationerna utförs i den ordningen. Vi kallar de tre rotationerna Alpha, Beta och Gamma.
3. Du har en punkt, P, som har kooridnaterna (x,y,z) när Alpha=Beta=Gamma=0.
4. Den punkten ska sitta på samma sätt i förhållande till bottenplattan när den är roterad.
Den nya punkten efter rotation kring x-axeln heter Px=(xx, yx, zx), och för rotationen kring x-axeln fås:
xx=x
yx=y*cos(alpha) - z*sin(alpha)
zx=y*sin(alpha) + z*cos(alpha)
motsvarande för de två andra axlarna är för Py
xy=z*sin(beta) + x*cos(beta)
yy=y
zy=z*cos(beta) - x*sin(beta)
resp. Pz
xz=x*cos(gamma) - y*sin(gamma)
yz=x*sin(gamma) + y*cos(gamma)
zz=z
Kör nu de här tre grejerna efter varandra så ska det bli rätt, Skapa först Px utifrån P, Py ifrån Px, Pz från Py, och sen är Pz din roterade punkt.Sv: Ett objekt som följer ett annat!
Om jag gör som du sa, så får jag ju 9 punkter för den nya placeringen. Px.x, Px.y, Px.z, Py.x, Py.y, Py.z, Pz.x, Pz.y, Pz.z eller?!
Jag har mixtrat lite och kommit fram till detta.. Men det funkar ändå inte..
Main3D.Mesh.Pos är bottenplattans position.
Items3D(4).Pos(x,y,z) är avstånden "axeln" ska vara från bottenplattan. I det här fallet är X=2.1, Y=0 och Z=0 fast så kommer det ju inte att vara i framtiden.
Items3D(4).Mesh.Pos är axelns placering
tmp_X_Pos = Main3D.Mesh.Pos.X + Items3D(4).PosX
tmp_Y_Pos = Main3D.Mesh.Pos.Y + Items3D(4).PosY
tmp_Z_Pos = Main3D.Mesh.Pos.Z + Items3D(4).PosZ
tmp_Y_Pos = tmp_Y_Pos * Cos(Main3D.Mesh.Rotation) - tmp_Z_Pos * Sin(Main3D.Mesh.Rotation)
tmp_Z_Pos = tmp_Y_Pos * Sin(Main3D.Mesh.Rotation) + tmp_Z_Pos * Cos(Main3D.Mesh.Rotation)
tmp_X_Pos = tmp_Z_Pos * Sin(Main3D.Mesh.ConvAngle) + tmp_X_Pos * Cos(Main3D.Mesh.ConvAngle)
tmp_Y_Pos = tmp_Y_Pos
tmp_Z_Pos = tmp_Z_Pos * Cos(Main3D.Mesh.ConvAngle) - tmp_X_Pos * Sin(Main3D.Mesh.ConvAngle)
tmp_X_Pos = tmp_X_Pos * Cos(Main3D.Mesh.Pitch) - tmp_Y_Pos * Sin(Main3D.Mesh.Pitch)
tmp_Y_Pos = tmp_X_Pos * Sin(Main3D.Mesh.Pitch) + tmp_Y_Pos * Cos(Main3D.Mesh.Pitch)
Items3D(4).Mesh.Pos.X = tmp_X_Pos
Items3D(4).Mesh.Pos.Y = tmp_Y_Pos
Items3D(4).Mesh.Pos.Z = tmp_Z_PosSv: Ett objekt som följer ett annat!
För det första så har du lite fel terminologi; en punkt består av de tre koordinaterna, så det är omvandlingar mellan tre olika punkter.
Är alldeles för trött för att verkligen sätta mig in i koden just nu, men det finns två problem.
-Det första är att första beräkningen av tmp-variablerna nog är fel. Det borde vara ett minustecken på ett eller annat sätt.
-Det andra kan hänga på att du har missförstått "punkter". Varje punkt måste beräknas helt och hållet utifrån hela den förra punkten. Det räcker alltså inte med dina tre tmp-variabler.
Det står ju t.ex. så här:
tmp_Y_Pos = tmp_Y_Pos * Cos(Main3D.Mesh.Rotation) - tmp_Z_Pos * Sin(Main3D.Mesh.Rotation)
tmp_Z_Pos = tmp_Y_Pos * Sin(Main3D.Mesh.Rotation) + tmp_Z_Pos * Cos(Main3D.Mesh.Rotation)
På den andra raden kommer tmp_Y_Pos redan ha förändrats. Jag skulle rekommendera dig att ha nio stycken temporära variabler, XX, YX, ZX, osv, + 3 för start-positionen. På så sätt får du inga sådana "mix-effekter".