79 lines
3.2 KiB
Plaintext
79 lines
3.2 KiB
Plaintext
The ODE Model Processor
|
|
-----------------------
|
|
|
|
Copyright 2007, Department of Information Science,
|
|
University of Otago, Dunedin, New Zealand.
|
|
|
|
Author: Richard Barrington <barri662@student.otago.ac.nz>
|
|
|
|
This is a Content Processor and Tag library written for use with
|
|
Microsoft Visual C# 2005 Express Edition and Microsoft XNA Game
|
|
Studio Express 1.0.
|
|
|
|
It can be used to read .x model vertex and index data before
|
|
insertion into the content pipeline. This is used to build ODE
|
|
Triangle Meshes which are then used for collision detection that
|
|
is more accurate than the default XNA bounding boxes or spheres.
|
|
|
|
Usage is fairly simple:
|
|
Build the library and reference the DLL in your project.
|
|
Add the DLL to the Content Pipeline
|
|
Set the content processor for you .x models to OdeModelProcessor.
|
|
|
|
Create triangle meshes as follows:
|
|
1) Create a space, but only one for all of models.
|
|
2) Create a triangle data.
|
|
3) Load the model.
|
|
4) Retreive the tag from the model.
|
|
6) Build the triangle mesh by calling d.GeomTriMeshDataBuildSimple.
|
|
|
|
Eg:
|
|
IntPtr space = d.SimpleSpaceCreate(IntPtr.Zero);
|
|
IntPtr triangleData = d.GeomTriMeshDataCreate();
|
|
Model obj = content.Load<Model>("Content\\mycube");
|
|
OdeTag tag = (OdeTag)obj.Tag;
|
|
IntPtr vertexArray = tag.getVertices();
|
|
IntPtr indexArray = tag.getIndices();
|
|
d.GeomTriMeshDataBuildSimple
|
|
(
|
|
triangleData,
|
|
vertexArray, tag.getVertexStride(), tag.getVertexCount(),
|
|
indexArray, tag.getIndexCount(), tag.getIndexStride()
|
|
);
|
|
IntPtr triangleMesh = d.CreateTriMesh(space, triangleData, null, null, null);
|
|
|
|
You can load multiple models and test for collisions with something
|
|
like this in the update method:
|
|
|
|
d.GeomSetPosition(odeTri1, obj1Position.X, obj1Position.Y, obj1Position.Z);
|
|
d.GeomSetPosition(odeTri2, obj2Position.X, obj2Position.Y, obj2Position.Z);
|
|
int numberOfContacts = d.Collide(odeTri1, odeTri2, ODE_CONTACTS,
|
|
contactGeom, d.ContactGeom.SizeOf);
|
|
|
|
Where odeTri1 and odeTri2 are triangle meshes you've created, obj1Position
|
|
and obj2Position are the positions of your rendered models in the scene,
|
|
ODE_CONTACTS is a constant defining the maximum number of contacts
|
|
to test for, contactGeom is a d.ContactGeom[] of length ODE_CONTACTS.
|
|
|
|
If numberOfContacts is greater than 0, you have a collision.
|
|
|
|
Other ODE functions such as d.SpaceCollide() also work; see ODE.NET BoxTest.cs.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the same terms as the ODE and ODE.Net libraries.
|
|
Specifically, the terms are one of EITHER:
|
|
|
|
(1) The GNU Lesser General Public License as published by the Free
|
|
Software Foundation; either version 2.1 of the License, or (at
|
|
your option) any later version. The text of the GNU Lesser
|
|
General Public License is included with this library in the
|
|
file LICENSE.TXT.
|
|
|
|
(2) The BSD-style license that is included with this library in
|
|
the file LICENSE-BSD.TXT.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
|
|
LICENSE.TXT and LICENSE-BSD.TXT for more details.
|