Diskuze: XNA free look camera
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 19 zpráv z 19.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Do těch tutoriálů jsem se díval a pořád si myslím, že to mám tak, jak to má být. Teda vím, že nemám, jinak by to fungovalo dobře... Když mám pohled nahoru nebo dolů, přičítám nebo odečítám hodnotu yaw a pomocí Matrix.CreateFromYawPitchRoll(yaw, 0, roll); přepočítám nové natočení a přidám ho k současné pozici. Roll měním při pohybu do stran.
osobně si myslim že chyba je zde:
Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(yaw, 0, roll);
pořadí které funguje mě to totok:
Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(yaw, roll,0);
nic jinýho tam nevidim
Dívám se podél kladné osy X, nahoru je kladná osa Z a doleva tudíž kladná osa Y. Když se chci otáčet doleva a doprava točím se kolem osy Z (měním roll). A když se chci dívat nahoru nebo dolů, točím se kolem Y (měním yaw) ne? Tak přece hodnotu pitch mám nula proto to podle mě musí být takto:
Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(yaw, 0, roll);
Když to dám tak, jak říkáš přestane fungovat otáčení do stran.
ale přece když mám
private Vector3 baseCameraReference = new Vector3(1, 0, 0);
znamená to, že se dívám po kladné ose X
a v matici view mám
Vector3.Backward
což je vektor (0,0,1), který udává natočení kamery, to znamená, že nahoru je osa Z přece.
Kdyby to tak nebylo, tak mi nemůže fungovat ani otáčení doleva a doprava. Jak říkám, když stojím na místě po načtení hry, tak všechno funguje jak má.
většinou se dává Y nahoru, ale je to vlastně jedno, co to dělá když se pohneš?
Dává já vím, ale mám to pro určitou aplikaci, kde to potřebuji právě takhle. Jak jsem říkal, když načtu hru a stojím na místě funguje vše jak má. pohled nahoru a dolů je bez problému. Když se pohybuji po mapě, otáčení doleva a doprava a chůze vpřed a vzad jde taky v pohodě, ale jakmile se chci podívat nahoru nebo dolů pokaždé to dělá něco jiného. jednou to místo pohledu nahoru jde dolů a opačně a jindy to opisuje malinké kružnice. Připadá mi, že se to točí pokaždé jinak, jakoby to nechtělo správně počítat ten úhel yaw.
Nevím jestli to pomůže ale tady je celá třída mojí kamery:
namespace ProjectX
{
class Camera
{
#region Fields
private Vector3 position = Vector3.Zero;
private float yaw;
private float roll;
private Vector3 lookAt;
private Vector3 baseCameraReference = new Vector3(1, 0, 0);
private bool needViewResync = true;
private Matrix cachedViewMatrix;
#endregion
#region Properties
public Matrix Projection { get; private set; }
public Vector3 Position
{
get
{
return position;
}
set
{
position = value;
UpdateLookAt();
}
}
public float Yaw //osa y
{
get
{
return yaw;
}
set
{
yaw = value;
UpdateLookAt();
}
}
public float Roll //osa z
{
get
{
return roll;
}
set
{
roll = value;
UpdateLookAt();
}
}
public Matrix View
{
get
{
if (needViewResync)
cachedViewMatrix = Matrix.CreateLookAt(
Position,
lookAt,
Vector3.Backward);
return cachedViewMatrix;
}
}
#endregion
#region Constructor
public Camera(
Vector3 position,
float yaw,
float roll,
float aspectRatio,
float nearClip,
float farClip)
{
Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.PiOver4,
aspectRatio,
nearClip,
farClip);
MoveTo(position, yaw, roll);
}
#endregion
#region Helper Methods
private void UpdateLookAt()
{
Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(yaw, 0, roll);
Vector3 lookAtOffset = Vector3.Transform(
baseCameraReference,
rotationMatrix);
lookAt = position + lookAtOffset;
needViewResync = true;
}
public void MoveTo(Vector3 position, float yaw, float roll)
{
this.position = position;
this.yaw = yaw;
this.roll = roll;
UpdateLookAt();
}
public Vector3 PreviewMove(float scale)
{
Matrix rotate = Matrix.CreateFromYawPitchRoll(yaw, 0, roll);
Vector3 forward = new Vector3(scale, 0, 0);
forward = Vector3.Transform(forward, rotate);
return (position + forward);
}
public void MoveForward(float scale)
{
MoveTo(PreviewMove(scale), yaw, roll);
}
#endregion
}
}
Hmm .. a nebude problém v tom, že při tom testování přerazíš úhel? Jakoby ses díval vlastně hore nohama? V fpskách máš vždy ten horní a spodní limit tak, že když se chceš podívat za sebe, tak se musíš otočit podle y osy.
To jsem moc nepobral... Dělám v tom teprve chvíli. Nešlo by to nějak
lidsky vysvětlit? 
Tak už jsem to vyřešil... Důvod byl takový, že jsem měl 3D skener, a
používal jsem komponentu, která mi načítala ty data a ukládala do určité
struktury a já je zobrazuji a pracuji dál s nima... Tak jsem to už nevydržel
a přepsal tu komponentu a můžu vesele používat osu Y nahoru
že mě to nenapadlo hned... 
Jde o 3D proximitní skener, který je na robotu... Robot jezdí a snímá
okolí kolem sebe... 
neukážu, protože
pracuji jen s jeho pořízenými daty a ne přímo s ním... 
Zobrazeno 19 zpráv z 19.