public override void Init() { //Ideas para generar el terreno para Bullet //We are getting a llitle bit crazy xD https://es.wikipedia.org/wiki/Paraboloide //Paraboloide Hiperbolico // definicion matematica //(x / a) ^ 2 - ( y / b) ^ 2 - z = 0. // //DirectX //(x / a) ^ 2 - ( z / b) ^ 2 - y = 0. //Paraboloide Circular //definicion matematica //(x / a) ^ 2 + ( y / b) ^ 2 - z = 0 ; a=b. // //DirectX //(x / a) ^ 2 + ( z / a) ^ 2 - y = 0. //Crear vertexBuffer int width = 1200; int length = 1200; totalVertices = 2 * 3 * (width - 1) * (length - 1); vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionTextured), totalVertices, D3DDevice.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); //Almacenar informacion en VertexBuffer //Cargar vertices var dataIdx = 0; var data = new CustomVertex.PositionTextured[totalVertices]; TGCVector3 center = TGCVector3.Empty; center.X = center.X - width / 2; center.Z = center.Z - length / 2; int a = 64; int size = 80; int n = 0; int triangles = 0; int vertexes = 0; for (var i = 0; i < width - 1; i = i + size) { for (var j = 0; j < length - 1; j = j + size) { //Vertices var v1 = new TGCVector3(center.X + i, center.Y + (FastMath.Pow2((center.X + i) / a) + FastMath.Pow2((center.Z + j) / a)), center.Z + j); var v2 = new TGCVector3(center.X + i, center.Y + (FastMath.Pow2((center.X + i) / a) + FastMath.Pow2((center.Z + j + size) / a)), center.Z + (j + size)); var v3 = new TGCVector3(center.X + (i + size), center.Y + (FastMath.Pow2((center.X + i + size) / a) + FastMath.Pow2((center.Z + j) / a)), center.Z + j); var v4 = new TGCVector3(center.X + (i + size), center.Y + (FastMath.Pow2((center.X + i + size) / a) + FastMath.Pow2((center.Z + j + size) / a)), center.Z + (j + size)); vertexes = +vertexes + 4; //Coordendas de textura var t1 = TGCVector2.Zero; var t2 = new TGCVector2(0, 1); var t3 = new TGCVector2(1, 0); var t4 = TGCVector2.One; //Cargar triangulo 1 data[dataIdx] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y); data[dataIdx + 1] = new CustomVertex.PositionTextured(v2, t2.X, t2.Y); data[dataIdx + 2] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y); triangles++; //Cargar triangulo 2 data[dataIdx + 3] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y); data[dataIdx + 4] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y); data[dataIdx + 5] = new CustomVertex.PositionTextured(v3, t3.X, t3.Y); triangles++; dataIdx += 6; n++; } } vertexBuffer.SetData(data, 0, LockFlags.None); //Rotar e invertir textura var b = (Bitmap)Image.FromFile(MediaDir + "Texturas/pasto.jpg"); b.RotateFlip(RotateFlipType.Rotate90FlipX); terrainTexture = Texture.FromBitmap(D3DDevice.Instance.Device, b, Usage.AutoGenerateMipMap, Pool.Managed); //Shader effect = TGCShaders.Instance.VariosShader; technique = TGCShaders.T_POSITION_TEXTURED; physicsExample = new TrianglePhysics(); physicsExample.SetTriangleDataVB(data); physicsExample.Init(MediaDir); UserVars.addVar("Tgccito_Position"); Camera = new TgcRotationalCamera(new TGCVector3(0, 200, 0), 800, Input); }