При импорте в джаве 3д модели из obj файла сбиваются нормали, код импорта - стандартный из примеров с официальго сайта. не подскажите как вообще можно подправлять такие вещи и вообще в какую сторону копать? с 3д довольно туго, так что приветсвуются правильные ссылки в гугл  заранее спасибо. | Код | import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import java.awt.event.KeyEvent; import java.io.FileNotFoundException; import java.net.MalformedURLException; import java.net.URL; import java.util.Enumeration;
import javax.media.j3d.Alpha; import javax.media.j3d.AmbientLight; import javax.media.j3d.Background; import javax.media.j3d.Behavior; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.RotationInterpolator; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.media.j3d.WakeupOnAWTEvent; import javax.swing.JFrame; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3f;
import com.sun.j3d.loaders.IncorrectFormatException; import com.sun.j3d.loaders.ParsingErrorException; import com.sun.j3d.loaders.Scene; import com.sun.j3d.loaders.objectfile.ObjectFile; import com.sun.j3d.utils.behaviors.vp.OrbitBehavior; import com.sun.j3d.utils.universe.PlatformGeometry; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.universe.ViewingPlatform;
public class SomeClass extends Applet { private static final long serialVersionUID = 2314234895161365954L;
private boolean spin = false;
private double creaseAngle = 60.0;
private URL filename = null;
private SimpleUniverse u;
private BoundingSphere bounds;
public class SimpleBehavior extends Behavior {
private TransformGroup targetTG;
private Transform3D rotation = new Transform3D();
private double angle = 0.0;
// create SimpleBehavior SimpleBehavior(TransformGroup targetTG) { this.targetTG = targetTG; }
// initialize the Behavior // set initial wakeup condition // called when behavior beacomes live public void initialize() { // set initial wakeup condition this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED)); }
@Override public void processStimulus(Enumeration arg0) { // decode event // do what is necessary angle += 0.1; rotation.rotY(angle); targetTG.setTransform(rotation); this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED)); }
} // end of class SimpleBehavior public BranchGroup createSceneGraph() { // Create the root of the branch graph BranchGroup objRoot = new BranchGroup();
// Create a Transformgroup to scale all objects so they // appear in the scene. TransformGroup objScale = new TransformGroup(); Transform3D t3d = new Transform3D(); t3d.setScale(0.7); objScale.setTransform(t3d); objRoot.addChild(objScale);
// Create the transform group node and initialize it to the // identity. Enable the TRANSFORM_WRITE capability so that // our behavior code can modify it at runtime. Add it to the // root of the subgraph. TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); objScale.addChild(objTrans);
int flags = ObjectFile.RESIZE; //if (!noTriangulate) // flags |= ObjectFile.TRIANGULATE; //if (!noStripify) // flags |= ObjectFile.STRIPIFY; // flags |= ObjectFile.REVERSE; ObjectFile f = new ObjectFile(flags, (float) (creaseAngle * Math.PI / 180.0)); f.setFlags(ObjectFile.LOAD_ALL); Scene s = null; try { s = f.load(filename); } catch (FileNotFoundException e) { System.err.println(e); System.exit(1); } catch (ParsingErrorException e) { System.err.println(e); System.exit(1); } catch (IncorrectFormatException e) { System.err.println(e); System.exit(1); }
objTrans.addChild(s.getSceneGroup());
bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); SimpleBehavior beh = new SimpleBehavior(objTrans); beh.setSchedulingBounds(bounds); objRoot.addChild(beh); if (spin) { Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0, 9000, 0, 0, 0, 0, 0);
RotationInterpolator rotator = new RotationInterpolator( rotationAlpha, objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f); rotator.setSchedulingBounds(bounds); objTrans.addChild(rotator); }
// Set up the background Color3f bgColor = new Color3f(0.0f, 0.0f, 0.0f); Background bgNode = new Background(bgColor); bgNode.setApplicationBounds(bounds); objRoot.addChild(bgNode);
return objRoot; }
public void init() { if (filename == null) { try { filename = new URL("file:/c:/3.obj"); } catch (MalformedURLException e) { System.err.println(e); System.exit(1); } }
setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config); add("Center", c);
// Create a simple scene and attach it to the virtual universe BranchGroup scene = createSceneGraph(); u = new SimpleUniverse(c);
// add mouse behaviors to the ViewingPlatform ViewingPlatform viewingPlatform = u.getViewingPlatform();
PlatformGeometry pg = new PlatformGeometry();
// Set up the ambient light Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f); AmbientLight ambientLightNode = new AmbientLight(ambientColor); ambientLightNode.setInfluencingBounds(bounds); pg.addChild(ambientLightNode);
// Set up the directional lights Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f); Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 1.0f); Color3f light2Color = new Color3f(1.0f, 1.0f, 1.0f); Vector3f light2Direction = new Vector3f(-1.0f, -1.0f, -1.0f);
DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction); light1.setInfluencingBounds(bounds); pg.addChild(light1);
DirectionalLight light2 = new DirectionalLight(light2Color, light2Direction); light2.setInfluencingBounds(bounds); pg.addChild(light2);
viewingPlatform.setPlatformGeometry(pg);
// This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. viewingPlatform.setNominalViewingTransform();
if (!spin) { OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); orbit.setSchedulingBounds(bounds); viewingPlatform.setViewPlatformBehavior(orbit); }
u.addBranchGraph(scene); }
public SomeClass() { init(); }
public void destroy() { u.cleanup(); }
public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(600, 600); f.add(new SomeClass()); f.setVisible(true); } }
|
Это сообщение отредактировал(а) hunterman - 17.5.2009, 14:01
|