Tarvitsisin jonkin kaavan, jolla saa laskettua kaksi kulmaa kahden kolmiulotteisen pisteen välillä. Tiedossa on tietysti pisteiden x- ja y- ja z-koordinaatit. Korkeusakselin ympäri kiertävä kulma on tietysti helppo laskea arkustangentilla, siihenhän tarvitaan vain pisteiden x- ja y-koordinaatteja (olettaen että x ja lveys, y syvyys ja z korkeus) Mutta "ylös ja alas" kääntyvässä kulmassa on ongelma. Niin kuin toisessakin kulmassa, pitäisi saada ainoastaan käyttöön kaksi koordinaattia. Z-koordinaatit ovat tietysti toiset koordinaatit, mutta käyttääkö toisena x-, vai y-koordinaatteja? Ei kai kumpaakaan, vaan pitäisi jotenkin laskea esin x- ja y-koordinaattien etäisyys toisistaan ja käyttää tuota pituutta toisena koordinaattina.
Joo, erittäin mukavaa kun ymmärsitte. :)
En tiedä puhunko täyttä potaskaa vai mitä, mutta näin minä järkeilin. Jos joku osaa tehdä tällaisen ja pistäkää koodivinkkiä, yritän päätellä siitä itse. Mitään selitysohjeita älkää antako, sillä kolmiulotteinen ajatteluni on rajoittunut.
P.S Puuhailen paraikaa the Linkku3D-moottorin parissa. Ja jos saan kahden pisteen 3D-koordinaattien väliset molemmat kulmat laskettua, voin tehdä moottorista täysin realistisen. (ellen ole aivan pahasti erehtynyt)
Moottorini toimii täydellisti, ellei katso alas tai ylös vaan pitää kameran suoraan 90 asteen kulmassa. Joka suuntaan, myös korkeussuunnaassa voi kuitenkin liikkua ja vaakatasossa kulmaa voi kääntää.
P.P.S Jos saan Linkun kuntoon (joka ei muuten enää silloin ole Linkku-nimen väärti), voin pistää sen tänne koodivinkiksi.
"kahden pisteen 3D-koordinaattien väliset molemmat kulmat"
Voitko määritellä suorat, joiden väliset kulmat haluat laskea.
No joo.. taitaa kallistua analyyttisen geometrian ja vektorilaskennan puolelle. Onhan niitä menetelmiä varmaan todella monia, mutta itse lähtisin liikkeelle 2D tasoilla xy, xz ja yz. (ja kun pisteet projisoidaan niille)
Nillä alkaisin laskea kulmia trigonometrisillä funktioilla. Lähinnä kylläkin tangentilla(koska qbasicissakaan ei ole muiden käänteisfunkioita).
Yksi vaihtoehto olisi lähteä vektori-3D-linjalle heti, mutta en ole niinkään varma helpottuuko työ tai väheneekö sen määrä yhtään. No kuitenkin ottaisin 3D-tasoja xy, yz ja xz, 3-ulotteisen suoran, niistä vektorit ja laskisin tarvittavat kulmat.
Itse asiassa en kyllä oikein ymmärtänyt kysymystä, mutta tiedän itsekin, että 3-ulotteisuudessa on paljon, mitä opetella ja miettiä ja oikeastaan voin melkein arvata mistä on kysymys.
Kannattaa ottaa jos lukiossa olet tai olet menossa pitkän matematiikan valtakunnallinen pakollinen kurssi MAA05 vai mikäs se nyt oli "Analyyttinen Geometria". Myös MAA04 "Trigonometria ja vektorit" on oikein mukava kurssi (en ole vielä käynyt mutta heti viikon päästä alkaa). Itse kyllä kävin heti alkuun kouluni tarjoaman vektorilaskentakurssin, jossa käytiin vektorit hyvinkin syvällisesti läpi ja voin sanoa, että hyötyä on ollut niiden tajuamisessa.
Tässä kuitenkin muutama äkkiä piirtämäni paperi näistä asioista pinnalta raapaistuna.
http://koti.mbnet.fi/~mikakem/2d.pcx
http://koti.mbnet.fi/~mikakem/3d.pcx
Sedälle:
lainaus:
"kahden pisteen 3D-koordinaattien väliset molemmat kulmat"
Voitko määritellä suorat, joiden väliset kulmat haluat laskea.
Ei tässä nyt ole mitään suoria. Ainoastaan kaksi pistettä.
Jos oletetaan vaikka että on 2d-koordinaatit x ja y ja toisen pisteen x2 ja y2.
x = 20
y = 20
x2 = 40
y2 = 20
Tästä huomaa, että koska ollaan y-akselilla samalla tasolla, mutta x2 on suurempi kuin x, on kulma 90.
Mutta jos lisäksi:
z = 20
z2 = 40
Niin silloin "ylös ja alas" kääntyvä kulma on 45.
Jos taas sekä x-, että y-koordinaatit ovat samat molemmilla pisteillä, mutta kakkospisteen z on suurempi, on toinen piste silloin suoraan ensimmäisen yläpuolella. Eli tällöinen ylös-alas-kulma on 0.
Eli tarvitsen nimenomaan funktion, joka kertoo tuon toisen kulman annetuista x-, y- ja z-koordinaateista. Ensimmäisen saan itsekin laskettua. Ongelmana on se, että en tiedä, miten laskisin kulman, jos sekä x-, että y-koordinaatit poikkevat toisistaan.
Ja KemXY:lle:
Tuo olisi varmaan kätevää ja odotan innolla lukion kursseja, mutta en tarvitse tähän vektoreita. Minulle riittää, kun saan laskettua kulmat kahden pisteen välillä.
Ja muille (miksei edellisillekin):
Tarvitsen siis vain esimerkkikoodia, jolle annetaan INPUT-variablena x,y,z,x2,y2,z2. Ja joka antaa OUTPUT-variablena kulmax:n ja kulmay:n.
Jos noiden pisteiden välinen jana projisoidaan xy-tasoon, niin lasketaan kulma y-akseliin nähden. Jos Y = Y2 ja X2>X onko kulma silloin 0 vai 180. Toinen kulma eli tuo ylösalaskulma on siis pisteiden välisen suoran kaltevuus xy-tasoon nähden. Jos Z = z2 onko kulma 90.
Ehkä kulma, jota haet, lasketaan kaavasta:
kulma = 90 - arctan((Z2 - Z)/SQR((X2 - X)^2 + (Y2 - Y)^2) (asteina)
Vastaukset:
Jos y = y2 ja x2 > x niin korkeusakselin ympäri kiertävä kulma on silloin 90, ei suoraan oikealle. Jos puhut ya-kulmasta, niin silloin sitä ei pysty määrittämään, koska ei ole z:aa määritelty.
Jos z = z2 niin ylösalaskulma on silloin 90.
Ja tuosta lausekkeesta, jonka annoit, näin sen, että on käytetty pythagoraan lausella a^2 + b^2 = c^2.
Tuota osaan kyllä käyttää itsekin ja olen jo moottorissa käyttänytkin. Mutta kokeilen, tuleeko oikea ya-kulma, jos otan arkustangentin ((zetojen erotuksen) ja (pythagoraan lauseen) osamäärästä.)
Ongelmia tuli. Mitä jos x = x2 ja y = y2 ? Silloin pythagoraan lauseena arvo on 0, eikä nollalla voi jakaa.
Näin on. Tuo on tarkistettava ehtolauseella ja merkittävä kulmaksi 0 tai 180 sen mukaan, onko Z2 > Z.
Rupesin katsomaan uudestaan ongelmaa, joka minulla oli ja huomasin, että en tarvitsekaan x:ää, y:tä ja z:taa laskeaksenin kulman vaan ainoastaan pituuden niistä sivuista joista voin muodostaa suorakulmaisen kolmion.
Ongelmana oli se, että putkasta löytyvä esimerkki kulmanlaskijasta käyttää x:ää ja y:tä vielä senkin jälkeen kun sille on syötetty sivujen pituudet. Niitä tarvittiin tarkastamaan juuri tuollaisia ongelmia, kuten onko 0 tai 180 jne. Mutta onnistuin korvaamaan ne ainoastaan tarkistamalla sivujen pituudet ja näin ollen sain kulmanlaskun toimimaan.
Enää minun tarvitsee vain ottaa kaksiuloitten x- ja y-pituus pythagoraan lauseella, jolloin saan ensimmäisen sivun ja toinen sivu onkin zetojen erotus.
Kas niin, ei tästä muuta kuin lisäämään nämä 3d-moottoriini niin saanpa senkin valmiiksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.