Java3D collision detection (full test source)

Hello!
I have struggled with this problem for a month now, so I really need some help.
I try to develop a game with collision detection with Java3D.
To narrow it down I had made two test-java-files for you.
File 1) Applet where I add all my objects (2 ColorCubes)
File 2) A KeyListener to stear one of the cubes. The key listener also checks for collisons.
All code is below, just compile and try.
The idea is that the cube that I can stear should stop outside the other cube from any
direction. But I can't detect that other cube at all.
So if any one could try the code and give me some hints or example I would be most
thankfull.
Best regards
Fredrik
import java.applet.*;
import java.awt.*;
import java.awt.Frame;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.*;
import java.util.*;
public class Test extends Applet
     BranchGroup branchGroup;
     ColorCube colorCube1 = new ColorCube(0.4); //The cube that you can navigate
     ColorCube colorCube2 = new ColorCube(0.4);
     TransformGroup transformGroup1;
     public void init()
          setLayout(new BorderLayout());
          GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
          Canvas3D canvas3D = new Canvas3D(config);
          add("Center", canvas3D);
          SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D);
          branchGroup = new BranchGroup();
          //Cube1
          transformGroup1 = new TransformGroup();
          Transform3D transform3D1 = new Transform3D();
          transform3D1.set(new Vector3f(0.0f, 0.0f, -20.0f));
          transformGroup1.setTransform(transform3D1);
          transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
          //for setShapeBounds
          transformGroup1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
          colorCube1.setCapability(Node.ALLOW_BOUNDS_READ);
          transformGroup1.setPickable(false);
          transformGroup1.addChild(colorCube1);
          branchGroup.addChild(transformGroup1);
          canvas3D.addKeyListener( new TestListener(transformGroup1, this) );
          //Cube2
          TransformGroup transformGroup2 = new TransformGroup();
          Transform3D transform3D2 = new Transform3D();
          transform3D2.set(new Vector3f(0.0f, 2.0f, -20.0f));
          transformGroup2.setTransform(transform3D2);
          colorCube2.setPickable(true);
          transformGroup2.addChild(colorCube2);
          branchGroup.addChild(transformGroup2);
          branchGroup.compile();
          simpleUniverse.addBranchGraph(branchGroup);
     public static void main(String[] args)
          Frame frame = new MainFrame(new Test(), 600, 400);
}The KeyListener with Collision detection
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.utils.geometry.*;
public class TestListener implements KeyListener
     final static float DISTANCE      = 0.1f;
     final static double TURNANGLE      = 0.1;
     float x = 0.0f;
     float y = 0.0f;
     float z = -20.0f;
     private double angle = 0.0;
     TransformGroup transformGroup;
     Transform3D positionTransform3D = new Transform3D();
     Transform3D angleTransform3D = new Transform3D();
     Test test;
     PickTool pickTool;
     Point3d point3d;
     Vector3d vector3d;
     Transform3D transform3D;
     public TestListener(TransformGroup tfg, Test t)
          test = t;
          transformGroup = tfg;
          pickTool = new PickTool(test.branchGroup);
          pickTool.setCapabilities(test.colorCube2, PickTool.INTERSECT_FULL);
            pickTool.setMode( PickTool.BOUNDS );
          positionTransform3D.set(new Vector3f(x, y, z));
     public void keyTyped(KeyEvent e)
     public void keyPressed(KeyEvent e)
          if( e.getKeyCode() == KeyEvent.VK_UP )
               if(isMovePossible(DISTANCE))
                    Transform3D temp = new Transform3D();
                 temp.set(new Vector3f(0, DISTANCE, 0));
                 positionTransform3D.mul(temp);
                 transformGroup.setTransform( positionTransform3D );
          else if( e.getKeyCode() == KeyEvent.VK_DOWN )
               if(isMovePossible(-DISTANCE))
                    Transform3D temp = new Transform3D();
                 temp.set(new Vector3f(0, -DISTANCE, 0));
                 positionTransform3D.mul(temp);
                 transformGroup.setTransform( positionTransform3D );
          else if( e.getKeyCode() == KeyEvent.VK_LEFT )
            angle = angle + TURNANGLE;
            angleTransform3D.rotZ(TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
          else if( e.getKeyCode() == KeyEvent.VK_RIGHT )
            angle = angle - TURNANGLE;
            angleTransform3D.rotZ(-TURNANGLE);
            positionTransform3D.mul(angleTransform3D);
            transformGroup.setTransform( positionTransform3D );
     public void keyReleased(KeyEvent e)
     public boolean isMovePossible(float distance)
          boolean retValue = true;
          PickBounds pickBounds = new PickBounds( test.colorCube1.getBounds() );
          pickTool.setShape( pickBounds, getCordinate(test.transformGroup1) );
          PickResult pickResult = pickTool.pickAny( );
          if ( pickResult != null )
               System.out.println("Boink");
               retValue = false;
          else
               retValue = true;
          return retValue;
     public static void main(String[] args)
          Frame frame = new MainFrame(new Test(), 600, 350);
    public Point3d getCordinate(TransformGroup transformGroup)
          Transform3D pointTransform3D = new Transform3D();
          transformGroup.getTransform( pointTransform3D );
          float[] cordinates = new float[16];
          pointTransform3D.get(cordinates);
          Point3d point = new Point3d(cordinates[3], cordinates[7], cordinates[11]);
          return point;
    public void printOutCordinates(TransformGroup transformGroup)
          Transform3D printOutTransform3D = new Transform3D();
          transformGroup.getTransform( printOutTransform3D );
          float[] cordinates = new float[16];
          printOutTransform3D.get(cordinates);
          for(int i = 0; i < cordinates.length; i++)
               System.out.println(i + ":" + cordinates);
          System.out.println();

First of all I would like to point out, that i've never actually used the PickTool, or in fact any element of the whole picking infrastructure from Java3D. Nevertheless I have done some collision detection in Java3D and it worked just fine. Unfortunatelly it required building the whole coldet ( collision detection ) algorythm from scratch :-)
If You want to collide only two bodies then You probably should consider creating a special Behaviour class that will react to the WakeupOnCollisionEntry and WakeupOnCollisionExit criterions. There is a good example of such a behaviour class in the Java3D demos, under TickTockCollision. However if there will be more bodies in Your scene and they will collide with each other in a random way, then You should rather consider building the whole coldet engine from scratch ( it's not very difficult, but it takes some time )
Either way, You could try to get a second opinion on the Java3D forum. People out there should have more experience with Java3D

Similar Messages

  • Camera Collision Detection - Is It Possible?

    Hi,
    I am making a 3D RPG game and I would like to know if it is possible to get collision detection on a camera created in Adobe Director 11.  I have my 3D character running through an underground maze and he detects correctly on the walls of the maze.  However, I also have a camera as a child to the character so this moves with him.  I have added a bounding-box to this camera but it still doesn't detect whereas the gunBB works fine, as does the characterBB.
    This is really confusing and I don't know what I am doing wrong.  Any help would be really appreciated!
    Thanks, Phil.

    Thanks for the reply.  It is not exactly what I am looking for as the script is different than the style I am using.  This is the script I have got so far, I have also added an extra camera to view what is happening.
    property pSprite, p3Dmember -- reference to the 3D member
    --property pLevel, maze -- Level
    --property pLeftArrow, pRightArrow, pDownArrow, pUpArrow -- arrow keys
    --property pCharacter -- character in the 3D world
    --property pTofuBB, pGunBB, gun --  character + gun
    --property gUseGun, hasGun
    --property pCamera, pCameraBoundingBox --camera and bounding box
    --property barrier,mountains,exitmaze
    --property door1, door2, turret, turretgun
    --property keylist, keypresslist -- for keys pressed
    --on beginSprite me
    --  -- define the 3D cast member
    --  p3Dmember = sprite(me.spriteNum).member
    --  -- reset the 3D world
    --  p3Dmember.resetWorld()
    --  pSprite = sprite(me.spriteNum)
    --  pCamera = pSprite.camera
    --  -- define level as 3DS level Plane - must all be defined after resetWorld()
    --  pLevel = p3Dmember.model("landscape")
    --  mountains = p3Dmember.model("mountains")
    --  turret = p3Dmember.model("turret")
    --  turretgun = p3Dmember.model("turretgun")
    --  maze = p3Dmember.model("maze")
    --  exitmaze = p3Dmember.model("exitmaze")
    --  pCharacter = p3Dmember.model("hero")
    --  gun = p3Dmember.model("gun")
    --  barrier = p3Dmember.model("barrier")
    --  door1 = p3Dmember.model("door1")
    --  door2 = p3Dmember.model("door2")
    --  -- stop hero walking biped animation
    --  pCharacter.bonesPlayer.pause()
    --  -- below for key control
    --  keylist = []
    --  keypresslist = []
    --  -- this sets up a list of keycodes to track.
    --  -- this code covers the arrow keys only, it could be changed to cover a full range of keys
    --  repeat with i = 123 to 126
    --    keylist[i] = i -- this creates a list of keycodes to track
    --    keypresslist[i] = 0 -- this creates a "last state" list that corresponds to the keycode.
    --    --keypresslist tracks the last known state of that key, so we can tell when a keypress has changed.
    --  end repeat
    --  -- key control end
    --  createBoundingBoxes
    --  createLight
    --end
    -- code used to create bounding boxes
    --on createBoundingBoxes
    --  -- create tofu bounding box for character
    --  tofuBB_MR = p3Dmember.newModelResource("tofuBox",#box)
    --  tofuBB_MR.height = 235
    --  tofuBB_MR.width = 235
    --  tofuBB_MR.length = 500
    --  pTofuBB = p3Dmember.newModel("tofuBox",tofuBB_MR)
    --  pTofuBB.worldPosition = pCharacter.worldPosition
    --  -- create parent child relationships
    --  pCharacter.addChild(pTofuBB, #preserveWorld)
    --  invisShader = p3Dmember.newShader("invisShader",#standard)
    --  invisShader.transparent = TRUE
    --  invisShader.blend = 50
    --  pTofuBB.shaderlist = p3Dmember.shader("invisShader")
    --  pCamera = p3Dmember.newCamera("camera")
    --  frontCam = p3Dmember.newCamera("frontCam")
    --  frontCam.fieldOfView = 35
    --  frontCam.transform.position = vector(-14150,-3100,-600)
    --  frontCam.transform.rotation = vector(90,0,180)
    --  pSprite.camera = p3Dmember.camera("frontCam")
    --  pCamera.fieldOfView = 75
    --  pCamera.transform.position = vector(500,1800,450) --450
    --  pCamera.transform.rotation = vector(90,0,180)
    --  pSprite.camera = p3Dmember.camera("camera")
    --  cameraModRes = p3Dmember.newModelResource("cameraModRes",#sphere)
    --  cameraModRes.radius = 200
    --  pCameraBoundingBox = p3Dmember.newModel("CameraBoundingBox",cameraModRes)
    --  pCameraBoundingBox.worldPosition = pCamera.worldPosition
    --  pCameraBoundingBox.shaderList = p3Dmember.shader("invisShader")
    --  pCamera.addChild(pCameraBoundingBox, #preserveWorld)
    --  pCharacter.addChild(pCamera,#preserveWorld)
    --  -- create gun bounding box
    --  gun.worldposition.z = gun.worldposition.z + 200
    --  gunMR = p3Dmember.newModelResource("gunSphere",#sphere)
    --  gunMR.radius = 218
    --  pGunBB = p3Dmember.newModel("gunSphere", gunMR)
    --  pGunBB.worldPosition = gun.worldPosition
    --  pGunBB.shaderList = p3Dmember.shader("invisShader")
    --  pGunBB.addChild(gun, #preserveWorld)
    --end
    -- code below used to light up level
    --on createLight
    --  -- create a point 'bulb' type light
    --  p3Dmember.newLight("Bulb Light", #point )
    --  -- position the light
    --  p3Dmember.light("Bulb Light").transform.position = vector(0,0,100)
    --  -- define light color and intensity
    --  p3Dmember.light("Bulb Light").color = rgb(255,255,255)
    --  -- Make the character model a parent of the light
    --  -- Bulb Light becomes a child of pCharacter
    --  -- This is done so that the light will always move
    --  -- with the character.
    --  pCharacter.addChild(p3Dmember.light("Bulb Light"),#preserveParent)
    --end
    --on keyUp me
    --  --pCharacter.bonesPlayer.pause()
    --  --if keypressed("s")
    --end
    --on keydown me
    --  if keypressed("c") then changeCamera
    --end
    --on changeCamera
    --  -- check the sprites camera and switch
    --  if pSprite.camera = p3Dmember.camera("frontCam") then
    --     pSprite.camera = p3Dmember.camera("camera")
    --     else
    --     pSprite.camera = p3Dmember.camera("frontcam")
    --     end if
    --end
    --on exitFrame me
    -- below detects which keys are pressed
    --repeat with i = 1 to keylist.count
    --inewstate= keypressed( keylist[i] )
    --if keypresslist[i] <> inewstate then -- this means the key changed status from whether it's up or down
    --if inewstate= 0 then
    -- they key was released
    --keyLastReleased = keylist[i]
    --if (keyLastReleased=123) then pLeftArrow = 0 -- 123 = left arrow key
    --if (keyLastReleased=124) then pRightArrow = 0 -- 124 = right arrow key
    --if (keyLastReleased=125) then
    --pDownArrow = 0 -- 125 = down arrow key
    --pCharacter.bonesPlayer.pause()
    --end if
    --if (keyLastReleased=126) then
    --pUpArrow = 0 -- 126 = up arrow key
    --pCharacter.bonesPlayer.pause()
    --end if
    --else
    -- the key was pressed
    --keyLastPressed = keylist[i]
    --if (keyLastPressed=123) then pLeftArrow = 1 -- 123 = left arrow key
    --if (keyLastPressed=124) then pRightArrow = 1 -- 124 = right arrow key
    --if (keyLastPressed=125) then pDownArrow = 1 -- 125 = down arrow key
    --if (keyLastPressed=126) then pUpArrow = 1 -- 126 = up arrow key
    --end if
    --keypresslist[i] = inewstate-- update so we remember its new state.
    --end if
    --end repeat
    -- by the time this repeat loop has finished, keypresslist will contain a complete index of what keys
    -- are held down, and which aren't.
    -- Note: most keyboards have a limit on how many keys they'll track simultaneously.
    --checkCollisions
    --characterMove
    -- gun collision start
    --if gUseGun = TRUE then
    --pTofuBB.addChild(pGunBB,#preserveParent)
    --pGunBB.worldPosition = pTofuBB.worldPosition
    --pGunBB.worldPosition.z = 500
    --pGunBB.worldPosition.x = pCharacter.worldPosition.x - 150 --50
    ---pGunBB.worldPosition.y = -860
    --pGunBB.rotate(0,0,-240)
    --pCharacter.bonesPlayer.pause()
    --gUseGun = FALSE
    --hasGun = TRUE
    --end if
    -- gun collision end
    --end
    --on characterMove
    -- if the right arrow is pressed,
    -- rotate the character 5 degrees about the z-axis
    --if pRightArrow then
    -- rotate character and camera
    --pCharacter.rotate(0,0,-2)
    --end if
    --if the left arrow is pressed,
    -- rotate character -5 degrees about the z-axis
    --if pLeftArrow then
    --pCharacter.rotate(0,0,2)
    --end if
    -- if the up arrow is pressed,
    -- move the character 5 pixels along the y-axis
    --if pUpArrow then
    --if (pcharacter.bonesPlayer.playing = 0) then
    --pCharacter.bonesplayer.loop = true
    --if (_key.shiftDown) then
    --pCharacter.bonesPlayer.playRate = 2
    --if (hasGun = TRUE) then -- running
    --pCharacter.bonesplayer.play("hero", 1, 6270, 8330, 1)
    --else
    --pCharacter.bonesplayer.play("hero", 1, 2067, 4130, 1)
    --end if
    --else
    --pCharacter.bonesPlayer.playRate = 1
    --if (hasGun = TRUE) then -- walking
    --pCharacter.bonesplayer.play("hero", 1, 4200, 6200, 1)
    --else
    --pCharacter.bonesplayer.play("hero", 1, 0, 2000, 1)
    --end if
    --end if
    --end if -- bonesPlayer playing
    --if (_key.shiftDown) then
    --pCharacter.translate(120,0,0)
    --else
    --pCharacter.translate(50,0,0)
    --end if
    --end if
    -- if the down arrow is pressed,
    -- move the character -5 pixels along the y-axis
    --if pDownArrow then
    --if (pcharacter.bonesPlayer.playing = 0) then
    --pCharacter.bonesplayer.loop = true
    --if (_key.shiftDown) then
    --pCharacter.bonesPlayer.playRate = 2
    --if (hasGun = TRUE) then -- running
    --pCharacter.bonesplayer.play("hero", 1, 6270, 8330, 1)
    --else
    --pCharacter.bonesplayer.play("hero", 1, 2067, 4130, 1)
    --end if
    --else
    --pCharacter.bonesPlayer.playRate = 1
    --if (hasGun = TRUE) then -- walking
    --pCharacter.bonesplayer.play("hero", 1, 4200, 6200, 1)
    --else
    --pCharacter.bonesplayer.play("hero", 1, 0, 2000, 1)
    --end if
    --end if
    --end if -- bonesPlayer playing
    --if (_key.shiftDown) then
    --pCharacter.translate(-120,0,0)
    --else
    --pCharacter.translate(-50,0,0)
    --end if
    --end if
    -- floor collision
    --thisPosn = pTofuBB.worldPosition
    -----thisPosn.z = 1000
    --tModelList = [pLevel, maze, door1, door2] -- removed wall as its no longer on level
    --tOptionsList = [#levelOfDetail: #detailed, #modelList: tModelList]
    --thisData = p3Dmember.modelsUnderRay(thisPosn,vector(0,0,-1),tOptionsList)
    --if thisData.count then
    --totalCount = thisData.count
    --repeat with dataIndex = 1 to totalCount
    --terrainPosn = thisData[dataIndex].isectPosition
    --- if (thisData[dataIndex].model = pLevel) then
    --tDiff = (terrainPosn.z - pTofuBB.worldPosition.z) + 375
    --pCharacter.translate(0,0,tDiff,#world)
    --exit repeat
    --end repeat
    --end if
    --end
    --on checkCollisions
    --tModelList = [pGunBB, barrier, mountains, maze, exitmaze, turret, turretgun]
    --tOptionsList = [#maxNumberOfModels: 2, #levelOfDetail: #detailed, #modelList: tModelList, #maxDistance: 300]
    -- make 4 rays around character checking for collisions, 90 degrees apart
    --repeat with i = 1 to 18
    --pCharacter.rotate(0,0,20,#self)
    --returnData = p3Dmember.modelsUnderRay(pCharacter.worldPosition,pCharacter.transform.xAxis,tOptionsList )
    --if (returnData.count) then
    -- first in array is closest
    --checkObjectFoundDistance(returnData[1])
    --end if
    --end repeat
    --end
    --on checkObjectFoundDistance thisData -- check distance from collision with objects
    --dist = thisData.distance
    -- check if distance is less than width of bounding box
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"barrier":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"mountains":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"maze":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"exitmaze":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"turret":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --if (dist < 150) then
    --case thisData[#model].name of
    --"gunSphere":
    --gUseGun = TRUE
    --"turretgun":
    -- get distance of penetration
    --diff = 150 - dist
    -- calculate vector perpend icular to the wall's surface to move the character
    -- using the #isectNormal property
    --tVector = thisData.isectNormal * diff
    -- move the character in order to resolve the collision
    --pCharacter.translate(tVector,#world)
    --end case
    --end if
    --end

  • Good collision detection?

    I have been looking into quadtrees since it is a way to detect collisions. Is there another better way to do this? My game also has a system of sorting sprites in an array based on there relative locations on the map. ie: my character can appear in front of a tree or behind it. I have a complex system to do this which tests polygons however I was wondering if there is an expert way to do this.

    well my tank game has two levels of collision detection. Well, I guess in a way it handles all the items in 3 levels.
    First level, I have a Vector storing the items on the screen. They're only evaluated in any way if they're in the Vector. I refresh that vector every 10 frames by testing all the objects in the game to see if they're in a rectangle that surrounds the screen.
    After that, to check collisions I have a simple distance formula check that finds the distance between the centers of two objects (ie. bullet and tank) and compares them to the sum of the largest dimensions (width for both) to see if they're close enough to collide.
    If that check returns true, it calls a third level of collision checking. This check intersects the areas I've created from polygons that outline my objects. This way even if they're rotated in any way, the check only returns true if there's an honest to goodness real accurate collision. This check takes much longer than the previous one, but since it has the first check behind it, this check isn't called very often.

  • Collision Detections in Tilemaps

    I need some help with collision detection with tilemaps. I have the following code for the tilemap:
    import java.awt.*;
    public class TileMap {
         final int EMPTY = 0;
         final int WALL = 1;
         private static final int WIDTH = 30;
         private static final int HEIGHT = 40;
         public static final int TILE_SIZE = 15;
         private int[][] map = new int[WIDTH][HEIGHT];
         public TileMap() {
              for (int i=0;i<HEIGHT;i++) {
                   map[0] = WALL;
                   map[29][i] = WALL;     
              for (int i=0;i<WIDTH;i++) {     
                   map[i][0] = WALL;
                   map[i][39] = WALL;
         public void paint(Graphics g) {
              for (int x=0;x<WIDTH;x++) {
                   for (int y=0;y<HEIGHT;y++) {
                        if (map[x][y] == WALL) {
                             g.setColor(Color.RED);
                             g.fillRect(x*TILE_SIZE,y*TILE_SIZE,TILE_SIZE,TILE_SIZE);
    Im finding it hard to find a good tutorial on simple collision detection. Can anyone explain how i would work out some simple collision detection. For example, lets say there is one sprite, how would i figure out which tile the sprite is on? How would i detect the next sprite? Just need the concept.
    Thanks very much.
    Edited by: Java_Jenius on Jun 28, 2009 8:34 PM                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    Take a look at http://www.13thmonkey.org/~boris/jgame/ for example.
    It is an open source gaming engine and features sprites and collision detection.

  • [as1, as2] Complex Collision Detection, part 2

    Hello.
    I´d like to know, if there´s another way, not being the gskinner´s class, to
    do a complex collision detection, one that can check for collision between,
    two irregular shapes, without using too much of the processor.
    Thank you.

    You mean the bitmap data hittest method took too much processor power?
    Without knowing all your details it is hard to tailor an exact system and how it should work. So here is somewhat of how I would do it.
    I am assuming that you are trying to check if many things are hitting many other things and that the shapes, while irregular, are not wildly divergent from their bounding box. (In otherwords that they are neat shapes that are at least close to their bounding box, perhaps filling some 70% or so.) And I'm also assuming that they are not complex paths, e.g., not a doughnut/torus.
    Be sure to use a double loop that only tests the correct number of pairs. So if there are n items you will need n*(n-1)/2 trials. NOT n*(n-1). Very important here. Of course even this approach is a bit inefficient, and you could try the RDC algorithm (http://lab.polygonal.de/articles/recursive-dimensional-clustering/) But for smallish numbers of items the first approach is probably suitable.
    Use the basic bounding box hittest on all the pairs. For the pairs where there is a hit at that level put them in an array for further processing. This test is fairly quick and there is no point using a more expensive test on each pair. (As to the above RDC, I haven't read the whole thing closely for awhile, so this step might already be part of that algorithm)
    Take that array and use one of the other methods like the bitmap hittest or some version of the same algorithm of gskinners.
    Did you do all three of these things together or just #3? I don't know exactly how much speed you need, but some combination of these things should work fairly well.
    I'm still not really clear on why you don't want to use gskinner's class. Have you tried it and does it provide enough speed? Did you try kglad's method? Did it provide enough speed? I don't think either of those people would mind you trying out their algorithms to learn from -- just to see what is possible. (Sorry if I'm misrepresenting you there kglad! I plan to go back and find that bit of code just to see what clever tricks you are up to. )
    If you can't get enough speed with those algorithms, then how are you sure that is where the problem lies? Maybe there is something else that is sucking cycles? Just a thought.
    The other choice is to simplify some of your shapes to circles or other regular shapes.

  • Error 1074397153 "cannot detect recognizable video source" in LabVIEW environment and but not in NI MAX

    Hi all,
    We have first tested our cameralink camera using NI MAX and we were able to grab with out any error.
    But when we are getting the  Error 1074397153 "cannot detect recognizable video source" in LabVIEW environment when we wanted to acquire from a 16 bit Cameralink standard camera. we are using Labview 2013 SP1 and Vision development module with  IMAQ 4.9 driver. Below is the VI pasted
    All the camera cables, power cables to the camera are fine.
    Kindly let us know what is the issue and any solution to solve it.
    with regards,
    Sri

    -What camera you are using? Did you try with any other software provided with camera vendor?
    -Did you check proper interface name?
    -Please post MAX screenshot also will be better to understand the changes...
    Thanks
    uday,
    Please Mark the solution as accepted if your problem is solved and help author by clicking on kudoes
    Certified LabVIEW Associate Developer (CLAD) Using LV13

  • Events Triggered By Collision Detection In Shockwave 3D Environment Happen More Than Once?

    Okay, I've finally managed to get my Director 3D game to move an object to a new random position when collision detection occurs with that object! HOWEVER, sometimes it will work as expected and other times the object seems to move SEVERAL times before settling. Anyone have any idea why it isn't always just moving once and settling as I'd hoped it would...?
    To see an example of the problem I'm facing, create a new Director movie then insert a new Shockwave 3D media element into that Director movie named "Scene" and apply the below code to that 3D media element. I've tried to trim the code down as much as possible to get right to the heart of the problem:
    =====
    property Scene  -- reference to 3D cast member
    property pSprite    -- referebce to the 3D sprite
    property pCharacter -- reference to the yellow in the 3D world
    property pTransformgreen01Flag -- reference to the flag which will trigger action to move green01 + increase score on collision
    property pTransformgreen02Flag -- reference to the flag which will trigger action to move green02 + increase score on collision
    on beginSprite me
      -- initiate properties and 3D world
      pSprite = sprite(me.spriteNum)
      Global Scene
      Scene = sprite(me.spriteNum).member
      Scene.resetWorld()
      Tempobjres = Scene.newmodelresource("sphereRES", #sphere)  --create sphere modelresource
      Tempobjres.radius = 10     --set sphere modelresrource radius to 20
      Tempobjres.resolution = 17   --set the sphere modelresource resolution to 17
      Tempobj = scene.newmodel("yellow", tempobjres)   --create a model from the sphere modelresource
      Tempshader = scene.newshader("sphereshd", #standard)   --create a new standard shader
      Tempshader.diffuse = rgb(250,250,10)   --set the diffuse color (in this case, a light green)
      Tempshader.texture = void   --set the texture of the shader to void
      Tempobj.transform.position=vector(0,0,0)
      Tempobj.shaderlist = tempshader   -- assign the shader to the model
      Tempobjres1 = Scene.newmodelresource("sphereRES1", #sphere)  --create sphere modelresource
      Tempobjres1.radius = 10     --set sphere modelresrource radius to 20
      Tempobjres1.resolution = 17   --set the sphere modelresource resolution to 17
      Tempobj1 = scene.newmodel("green01", tempobjres1)   --create a model from the sphere modelresource
      Tempshader1 = scene.newshader("sphereshd1", #standard)   --create a new standard shader
      Tempshader1.diffuse = rgb(100,200,50)   --set the diffuse color (in this case, a light green)
      Tempshader1.texture = void   --set the texture of the shader to void
      Tempobj1.transform.position = vector(25,25,0)
      Tempobj1.shaderlist = tempshader1   -- assign the shader to the model
      Tempobjres2 = Scene.newmodelresource("sphereRES2", #sphere)  --create sphere modelresource
      Tempobjres2.radius = 10     --set sphere modelresrource radius to 20
      Tempobjres2.resolution = 17   --set the sphere modelresource resolution to 17
      Tempobj2 = scene.newmodel("green02", tempobjres2)   --create a model from the sphere modelresource
      Tempshader2 = scene.newshader("sphereshd2", #standard)   --create a new standard shader
      Tempshader2.diffuse = rgb(100,200,50)   --set the diffuse color (in this case, a light green)
      Tempshader2.texture = void   --set the texture of the shader to void
      Tempobj2.transform.position = vector(-25,-25,0)
      Tempobj2.shaderlist = tempshader2   -- assign the shader to the model
      --the following lines will add collision detection for all three on-screen 3D objects
      Tempobj.addModifier(#collision)
      Tempobj.collision.enabled=true
      Tempobj1.addModifier(#collision)
      Tempobj1.collision.enabled=true
      Tempobj2.addModifier(#collision)
      Tempobj2.collision.enabled=true
      Tempobj.collision.resolve=true
      Tempobj1.collision.resolve=true
      Tempobj2.collision.resolve=true
      --the following lines will tell Director what to do with a specific object when it collides with another
      Tempobj.collision.setCollisionCallBack(#beepsound, me)
      Tempobj1.collision.setCollisionCallBack(#hitgreen01, me)
      Tempobj2.collision.setCollisionCallBack(#hitgreen02, me)
      pCharacter = Scene.model("yellow")
      -- we must define pCharacter after we use the resetWorld() command
      -- otherwise this variable object will be deleted
      createCollisionDetect
      pTransformgreen01Flag = false
      pTransformgreen02Flag = false
    end
    on createCollisionDetect
      Global Scene
      -- add collision modifier to the character
      pCharacter.addmodifier(#collision)
      -- set bounding geometry for collision detection to bounding box of model
      pCharacter.collision.mode = #mesh
      -- resolve collision for character
      pCharacter.collision.resolve = TRUE
    end
    on keyDown
      Global Scene
      case(chartonum(the keypressed)) of
        30: --up arrow
          scene.model("yellow").translate(0,5,0)
        31: --down arrow
          scene.model("yellow").translate(0,-5,0)
        28: --left arrow
          scene.model("yellow").translate(-5,0,0)
        29: --right arrow
          scene.model("yellow").translate(5,0,0)
      end case
    end
    --when "yellow" (player character) hits another object, this will happen:
    on beepsound me, colData
      beep --plays sound
    end
    --when "green01" is hit by another object, this will happen:
    on hitgreen01 me, colData
      Global Scene
      pTransformgreen01Flag=true
    end
    --when "green02" is hit by another object, this will happen:
    on hitgreen02 me, colData
      Global Scene
      pTransformgreen02Flag=true 
    end
    on enterFrame me
      Global Scene
      if pTransformgreen01Flag then
        --the following lines will generate new random x and y co-ordinates for green01
        randomx=random(-110,110)
        green01x=randomx
        randomy=random(-90,90)
        green01y=randomy
        Scene = member("Scene")
        Scene.model("green01").transform.position = vector(green01x,green01y,0)
        pTransformgreen01Flag = false
      end if
      if pTransformgreen02Flag then
        --the following lines will generate new random x and y co-ordinates for green02
        randomx=random(-110,110)
        green02x=randomx
        randomy=random(-90,90)
        green02y=randomy
        Scene = member("Scene")
        Scene.model("green02").transform.position = vector(green02x,green02y,0)
        pTransformgreen02Flag = false
      end if
    end
    =====
    I imagine the part that's causing the issue is the "on enterFrame me" part at the end, but can't see any reason why it wouldn't just perform the desired action ONCE every time...?
    This is really confusing the hell out of me and is pretty much the final hurdle before I can call my game "finished" so any and all assistance would be GREATLY appreciated!

    You can get yourself a used copy of my book http://www.amazon.com/Director-Shockwave-Studio-Developers-Guide/dp/0072132655/ for $0.82 + shipping.  Chapter 14 contains 33 pages which deal specifically with the vagaries of the collision modifier.
    You can download just the chapter on Collision Detection from http://nonlinear.openspark.com/book/Collisions.zip.  This includes the demo movies and the unedited draft of the text for the chapter.
    Perhaps you will find this useful.

  • URGENT: Collision Detection In Tiled Map

    HELP!!!!! I am creating a tile map of size 32*32. And the character image size is also 32*32. Now i am stuck in making collision with the walls. I have tried my own method but to no avail. Has anyone tried to doing collision detection? Need a simple logic method to detect the collision...
    (Using keyevent to control the character moving around)
    Pls I really appreciate your help!!!!!!!
    Thanks.....

    I assume you have some way of knowing that you need to display a wall tile on the map, so before you move a particular direction check to see if the square you will move to is an acceptable move (no wall, door, mountain, water etc). If it is unacceptable play a little sound or display a message, otherwise do the move.

  • 2D Pixel Collision detection on XML tiled map

    Hello,
    I'm designing a game where the player can move through a city composed of 2D image tiles. Right now we have successfully got the pixel collision detection to work on a large single image consisting of an invisible mask image and a visible image that shows a cluster of buildings and objects. The mask overlays the visible buildings and blocks / allows movement based on the color of the mask. Black is a collision, white is open space, etc.
    But this technique won't work for the game, since there will be many cities and vastly larger than this little testbed. I cannot create multiple huge cities into one file - the file would be several megs large, and I'm looking at dozens of cities.
    My idea is to create tiled maps, which will save the coordinates for the various building/object tiles in an XML file. However, I do not know how to make the collision detection work with such a tiled map. Moreover, I don't know if constructing a mosaic city using XML coordinates is the best way to go - I'm open for suggestions. My goal is to simply be able to assemble a city from individual tiles of buildings and masks, and drive/walk my character through the city with pixel collision detection, without using the current setup of a single image and a single mask.
    Any advice/suggestions offered will be GREATLY appreciated! This is our first Java project, but hopefully we can make this work.
    Thank you so much!
    Message was edited by:
    Gateway2007 - clarifying that this is a collision detection based on pixels, not planes or other method.

    Sound like this might be too late of a suggestion, but have you looked at Slick at all?
    http://slick.cokeandcode.com/static.php?page=features
    It might help with the tiling and collision aspects.

  • Error 1074397153 Cannot Detect Recognizable Video source

    I'm using a single PCI1410 card to acquire images from two cameras and display those images in Labview using the Multiple Camera Acquisition.vi found on the NI website.  I'm running Windows XP, and my two cameras are Sony XC-HR70's with a resolution of 1024X768 each, running ~15FPS (total for both) thru the frame grabber.  I have one camera as a master, supplying the HD & VD synch signals for both my slave camera and the PCI1410.  Here is my problem:
          Whenever I change the light intensity for the cameras drastically (ie, abruptly shutting off the light source or blocking the camera), I get an error in Labview:  "1074397153 @ IMAQ Extract Buffer.vi.   NI-IMAQ: Cannot detect recognizable video source".  If I perform a gradual decrease in light intensity, I don't get the error.  Unfortunately, the users often need to toggle on and off my camera illuminators abruptly, so a gradual transition is not an option.
           I thought this was a MAX issue, but it is not-MAX gives no errors regardless of light intensity.
           I also tried decreasing the white level and/or increasing the black level-(per NI Knowledgebase post) all that did was decrease my image quality, error still appeared.  The error first appears in imgwaitforimaqoccurrence.vi which is inside imgsessionexaminebuffer.vi. 
    If I could somehow ignore the error and insert a ~ 500mS delay and then re-attempt to acquire video lock, it would probably work.  Just not sure how to do this, or if it is the right approach.  Any ideas?

    Hey wowens,
    I was wondering if you ran just a simple grab example program, and perform the same action of shutting off the camera's light source, do you get the same error? The error you are getting means that the frame grabber is not receiving any data from the camera in the expected timeout period. There shouldn't be any reason why decreasing the light quickly should stop the camera from sending data, as the camera should still be sending some data, like all black pixels or something. I might suggest tapping the data coming in with an oscilloscope to see if the data stops when you decrease the light. If you can't do this, I might suggest altering the code so that you don't stop the loop. You could also look at the shipping example called LL Scan Multiple Channels.VI. What version of the NI-IMAQ driver are you using? I would suggest that you upgrade to the most recent if you don't have it. Other than that it sounds like you need to find out what is causing the error before you start to find a solution.
    I hope this helps at least a little. Let me know if you have any questions or concerns. Thanks, and have a great day.
    Regards,
    DJ L.

  • Error 0xBFF6001F - Cannot detect recognizable video source

    Hi,
    I'm using a NI PCI-1433 card with a Sentech camera.
    When I try to get a snap from the camera in MAX, I've the following error : 0xBFF6001F - Cannot detect recognizable video source.
    I use the icd file given by the camera constructor (Alliance Vision) for the camera parameters.
    I have Labview 2012 SP1 and MAX 5.4.0.
    Has someone any idea ?
    Maugan.

    Hi Maugan,
    Did you already look at this KB?
    Best regards.
    Paolo_P
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    Travaux Pratiques d'initiation à LabVIEW et à la mesure
    Du 2 au 23 octobre, partout en France

  • Please i need help in Collision  detection

    i want to make collision detection system
    but i have no good papers or examples about collision to can make simple collision if anyone can give me good link please

    http://www.flipcode.com/articles/article_basiccollisions.shtml
    regards

  • KeyPressed / collision detection

    I have a tile based platformer I am making and am having some trouble with the collision detection. I have it so that the game detects a collision before it actually occurs so that it wont happen in the game. However, it only appears to works right if i tap the arrow key into the wall, and if i hold the arrow key down i fly right through the tile until i let go (if i let go inside a block the hero gets stuck because it detects a collision anywhere i try to move after that). At this time i had the new coordinate to detect collision based on which direction i was moving gotten from keyPressed. Since this didnt work (assumed it was because the game loop and keyPressed dont take turns performing their actions) I made the new coordinate collision be detected from a method called in the main game loop and the result was that if I held down the key and flew into a wall, it doesnt stop exactly at the right spot (but I cant go through an entire row of tiles) but when I go the opposite direction from the collision (open space should work fine) it works fine until a point where in mid air it acts like a collision occured.
    I have tried very hard to find the error in my code concerning the collision detection and need to make sure these problems arent a result of limitations of keyPressed or something, but rather just the code i've written

    ok well I now have it set up so that before the hero moves it checks to see if the move is valid from each pixel starting at the hero to the length the hero moves in 1 directional press (using a rectangle that is the size of the hero, then has width 1 pixel larger etc until reaches the length of a move). The collision detection method returns true if there is a collision at any point, false otherwise. I tried to put the method in both the keyPressed method (for each case of a directional key pressed) as well as in the main game loop (not both at the same time) and neither worked perfectly and both worked about the same. Now the problem is that as long as the hero approaches the tile from a far away distance it works perfectly (a tile is 40 pixels in width and hero is 30), it appears that if the hero approaches from around 40 pixels out it will work but anything less and it will go through the tile as far from the 40 pixel mark it started (ie if hero starts at 37 pixels from tile and moves, it will go through the tile 3 pixels) then it can only travel back to the position it started even if there is no collision detected. Again, it appears that the hero must be about 40 pixels out (not sure if this is coincidence or it is exactly the length of the tile for a reason). Really can't figure this out, dont think there is a problem with the code i have written but probably i'm approaching the solution wrong

  • SDRAM in full test

    This morning I turned on my iPod . The top of the screen is black and says SDRAM Full Test. The rest of the screen says "Please wait... RUN: BL on PASS: BL blink FAIL: BL off. Reset to continue. I purchase this in 2006 is really old but this is only the second time in years this happen and the first time was in 2006.
    I have toggle on and off. I also have follow direction to push on center wheel and menu for 10 seconds with no luck. I can not tell if it is charged. I also plug into the computer and it is not recognized. I also have a old Mac Pro 10. 4 so can't download Itunes.
    I have been thinking about a new lap top maybe I need to retire all my old stuff but it works for me.
    I have tried to reset my iPod numerous times, and even looked on this site to make sure I was doing it right, and it will not respond. I even tried to connect it to my computer and nothing happened. I left my iPod at home hoping maybe the battery would die, and it has been on for several hours and will not come off this screen. I don't know how I got to this screen or how to get rid of it. Can someone please help me?

    A Reset is what you need to do.  Sounds like you tried already, but be sure to do it precisely as described in this document
    http://support.apple.com/kb/ht1320 - (See How to reset an iPod with a Click Wheel)

  • Ipod classic flashing SDRAM full test - I need help

    Hi All,
    Glad I found this site. I have 2 Ipods and having trouble with my Ipod Classic (30 GB). I had charged it up, turned it off and locked it. I unlocked it today
    and probably pushed the centre button, and the menu and the play to get it started. Anyway, it is now flashing this message:
    SDRAM Full Test
    please wait...
    RUN: DB on
    PASS: BL blink
    FAIL: BL off
    Reset to continue.
    The whole thing seem to be frozen; I can't get it to do anything but flash this message. What does it mean? I don't want to reset and loose everything, as I'm kind of using it as a back up for pics I took off my computer, etc. Can Someone please help me with this? Thanks for any advice, Carolfromtoronto

    found the answer! - posted in 2010 from Bryan: hold the centre and menu buttons down at the same time for about 15 seconds. Had to do it about 3 times until the apple icon comes up and then its ok. Thank you.
    Now to update my 'stuff'. I love this board! Thanks.

Maybe you are looking for