lopta v 3D   otázka

VB.NET, XNA, DirectX

Dobrý deň,

Chcel by som spraviť hru, kde sa lopta pohybuje po 3D teréne.

Pohyb po rovine viem spraviť, padanie tiež, ale neviem spraviť pohyb po šikmej rovine(45° alebo -45°).Nevedel by mi niekto povedať aspoň vzorce ?

Rovina môže byť aj stúpajúca, aj klesajúca.Pri klesaní by mala ísť lopta rýchlejšie ako na rovine a pomalšie ako padá, pri stúpaní by mala ísť pomalšie.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde jen o to podle aktuálního místa na terénu spočítat výšku. Postup, jak to udělat, je např. v seriálu o XNA, který máme zde na webu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No ten tutoriál som prešiel.Zostiaviť svetovú maticu by som asi aj zvládol, ale ako spočítať rýchlosť pohybu(a pre každú os zvlášť)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nestačí si zapamatovat pozici v minulém snímku a použít pro určení rychlosti rozdíl nadmořské výšky z minulého a aktuálního snímku.

Záleží, o co konkrétně jde, ale na jednoduché věci by to mohlo stačit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aj by stačilo, ale ako ten rozdiel spočítať ? A ešte by som chcel, aby sa ta lopta gúľala a kopírovala terén, nie ako nosorožec z toho Vášho článku.

Ešte som si uvedomil, že ja to vlastne nebudem robiť vo Visual Basicu ale v C# a teda som nesprávne zaradil vlákno do fóra.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No to si musíte spočítat podle toho terénu, nevím, v jaké ho máte reprezentaci. Chce si to nakreslit a vymyslet vzorečky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Sú to vlastne dve modely. Trebalo by teda preložiť zo stredu lopty nadol polpriamku, a zistiť vzdialenosť k najbližšiemu bodu na modeli levelu. Ale už to je namňa priveľa a to nehovorím o tom, že lopta nemusí byť vždy na celočíselných súradniciach(teda presne nad vertexom).Nemohol by ste mi napísať aspoň ako zistiť, nad ktorým trojuholníkom levelu tá lopta je? Potom už to snáď zvládnem podľa tutoriálu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V článku http://www.vbnet.cz/clanek--82-xna_2_0_v... je v kapitole Zjištění výšky terénu v konkrétním bodě. Podívejte se zejména na kód té metody, ta tohle řeší (kdyžtak si to konvertorem zkonvertujte do C#).

Nejdřív zjistí, nad kterým trojúhelníkem to je, a pak dopočítá podle výšek jeho tří bodů přesnou nadmořskou výšku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To by fungovalo, ale v článku máte body v poli a ja tam budem mať model a nie výškovu mapu, ako sa potom dostanem k súradniciam bodov ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Blbě.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý deň,

Ako tie trojuholníky získať som už našiel, pracujem na nájdení vzdialenosti bodu od trojuholníka pod ním. Ako ale vypočítam výšku

bodu v trojuholníku(nie štvorci ako vo vašom článku) keď viem XZ súradnice a viem že to je nad trojuholníkom alebo pod ním?

Ak Vás zaujíma doterajší kód:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace _3DBall
{
    public struct Triangle
    {
        public Vector3 I1;
        public Vector3 I2;
        public Vector3 I3;
        public Triangle(Vector3 i1, Vector3 i2, Vector3 i3)
        {
            I1 = i1;
            I2 = i2;
            I3 = i3;
        }
        /// <summary>
        /// Checks if point is above or below or inside triangle.
        /// Works if triangle is rectangular and two sides which are perpendicular each to other are each parallel to X or Z axis.
        /// </summary>
        /// <param name="position"></param>
        /// <returns></returns>
        public bool Contains(Vector3 position)
        {
            float minx = Math.Min(I1.X, Math.Min(I2.X, I3.X));
            float maxx = Math.Max(I1.X, Math.Max(I2.X, I3.X));
            float minz = Math.Min(I1.Z, Math.Min(I2.Z, I3.Z));
            float maxz = Math.Max(I1.Z, Math.Max(I2.Z, I3.Z));
            return minx < position.X & position.X < maxx & minz < position.Z & position.Z < maxz;
        }
        private float Lerp(float min, float max, float coef)
        {
            return min + (max - min) * coef;
        }
        public float YAt(float dx, float dz)
        {
            throw new NotImplementedException("");
        }
    }
    public class Extractor
    {
        Matrix[] transform;
        Triangle[] triangle;
        public Extractor() { }
        private void EMMP(ModelMesh mm, ModelMeshPart mmp, ref Matrix xform,
            List<Triangle> triangles)
        {
            Vector3[] a = new Vector3[mmp.NumVertices];
            mm.VertexBuffer.GetData<Vector3>(mmp.StreamOffset + mmp.BaseVertex * mmp.VertexStride,
                a, 0, mmp.NumVertices, mmp.VertexStride);
            for (int i = 0; i != a.Length; ++i)
                Vector3.Transform(ref a[i], ref xform, out a[i]);
            if (mm.IndexBuffer.IndexElementSize == IndexElementSize.ThirtyTwoBits)
            {//32bit indices
                int[] indices = new int[mmp.PrimitiveCount * 3];
                mm.IndexBuffer.GetData<int>(mmp.StartIndex * 4, indices, 0, mmp.PrimitiveCount * 3);
                for (int i = 0; i != mmp.PrimitiveCount;++i)
                    triangles.Add(new Triangle(a[indices[i * 3]],a[indices[i * 3 + 1]],a[indices[i * 3 + 2]]));
            }
            else
            {//16bit indices
                short[] indices = new short[mmp.PrimitiveCount * 3];
                mm.IndexBuffer.GetData<short>(mmp.StartIndex * 4, indices, 0, mmp.PrimitiveCount * 3);
                for (int i = 0; i != mmp.PrimitiveCount; ++i)
                    triangles.Add(new Triangle(a[indices[i * 3]], a[indices[i * 3 + 1]], a[indices[i * 3 + 2]]));
            }
        }
        private void EMM(ModelMesh mm, ref Matrix xform,
            List<Triangle> triangles)
        {
            foreach (ModelMeshPart mmp in mm.MeshParts)
                EMMP(mm, mmp, ref xform, triangles);
        }
        public void ExtractModel(Model m)
        {
            transform = new Matrix[m.Bones.Count];
        }

    }
}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Alebo ak to treba pomocou výškovej mapy, tak ako tam zaznačiť vertikálne steny a animácie? Na niektorých miestach by sa hodilo namiesto postupnej zmeny výšky medzi dvoma bodmi urobiť skok(niečo podobné ako namiesto sínusoidy štvorcovú vlnu) a napríklad aj rovinu, u ktorej výška jednej z jej hran sa v čase mení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback