I have an object imported from ms3d.this object actually as node. i want this object have gun. I think to make gun i must attach controller to this object.But unfortunately :x i see requirement direction to create controller. I don't meet method to get direction from node location. anyone can help me How to get direction from Node??? :x
You get get the rotation via getWorldRotation(). But if you attach the gun to the model node you won't need that. What direction do you need?
hmmm
i mean,wanna make controller to point bullet. So i can control it's moving as i want. I try to extend controller like this:
package MoveController;
import com.jme.math.Vector3f;
import com.jme.scene.Controller;
import com.jme.scene.Node;
import com.jme.scene.Spatial;
import com.jme.scene.TriMesh;
public class straightMove extends Controller{
private static final long serialVersionUID = 1L;
/** Bullet that's moving */
/* mover = movtimeing object
* target = checkec object //if(!utama.isActive())
* */
TriMesh mover;
Node target;
Node rootNode;
/** Direciton of bullet */
Vector3f direction;
/** speed of bullet */
float speed = 10;
/** Seconds it will last before going away */
float lifeTime = 5;
public straightMove(TriMesh mover,Node target,Vector3f direction,Node rootNode) {
this.mover= mover;
this.target=target;
this.direction = direction;
this.direction.normalizeLocal();
this.rootNode=rootNode;
// TODO Auto-generated constructor stub
}
public void update(float time) {
lifeTime -= time;
/** If life is gone, remove it */
if (lifeTime < 0) {
rootNode.detachChild(mover);
mover.removeController(this);
return;
}
/** Move bullet */
Vector3f bulletPos = mover.getLocalTranslation();
bulletPos.addLocal(direction.mult(time * speed));
mover.setLocalTranslation(bulletPos);
System.out.println("update");
/** Does the bullet intersect with target? */
if (mover.getWorldBound().intersects(target.getWorldBound())) {
lifeTime = 0;
playSound();
}
}
public void detachChild(){
//please clear mover
}
private void playSound(){
}
public Spatial getMover(){
return mover;
}
}
we can see there. There is an parameter Vector3f as direction. This vector is got from Object(ms3d as Node).So i must have vector3f from this Object to add controller.Isn'it? That my idea. I don't know it can work or not.
ahaa,
i have iready try to solve it by myself.I have already realize that direction is value of angle of rotation.In my project i create direction in x,y plane. So doesn't difficult i think. I just put this code to change direction:
direction.x = FastMath.cos(getAngleRotation()+getStartAngle());
direction.y = FastMath.sin(getAngleRotation()+getStartAngle());
direction.z = 0;
you can get the direction usually that way:
Vector3f direction = node.getLocalRoataion().getRotationColumn(2);
what is the usage of 2 in .getRotationColumn(2);
?
It’s the “bad” way of doing:
node.getLocalRotation().mult(Vector3f.UNIT_Z);
It’s generally done by people who either have no idea what they are doing (and copied it from somewhere) or are too clever for their own good.