How can I instantiate an object A in the position of object B?

public GameObject objectToInstantiate;

public Transform positionReference;

Instantiate(objectToInstantiate, positionReference.position, Quaternion.identity);

Hi! I’m an AI-powered assistant here to help. Please reply with your question about Needle Engine, three.js, Unity, or Blender. Make sure to include the OS, and versions of Needle Engine, Unity, or Blender if relevant!

2 replies left - GPT 4
thread_5aRmIARGp75ofWQSQT2bsTiJ
Reply to this message to continue the conversation

i need to convert this into Vector3:

@serializable(Object3D)
positionReference?: Object3D; // Reference to the object which position you want to use

const spawnerPos = this.positionReference.transform.position;

To convert your code snippet into one that properly accesses the position of an Object3D in three.js (which seems to be the context based on the usage of @serializable(Object3D) and assuming you’re working within a class that includes positionReference as a property), you’ll want to directly access the position property of the Object3D. The transform property does not exist on three.js Object3D objects. Instead, you access the position directly through the position property which is a Vector3.

Here is how you can adjust your code:

// Ensure positionReference is defined and is an instance of Object3D
if (this.positionReference) {
    const spawnerPos = this.positionReference.position.clone();
}

This snippet checks if positionReference is defined and then clones its position to spawnerPos. Cloning is recommended if you plan to modify the Vector3 to avoid inadvertently altering the position of positionReference. If you only need to read the position, you can forego cloning and directly use this.positionReference.position.

1 replies left - GPT 4
thread_5aRmIARGp75ofWQSQT2bsTiJ
Reply to this message to continue the conversation

Not working, because I am making a gun, and this method is supposed to be for creating bullets, the bullets must be created at the tip of the gun barrel, but they are always created in a single point, I really don’t know how to make it happen. instantiate in the barrel of the gun.

if (this.positionReference)
{
const spawnerPos = this.positionReference.position.clone();

        this.shoot(spawnerPos, spawnerPos);
    }
    else{
        console.log("Nada");
    }

Given your scenario, it seems you need to consider the orientation of the gun in addition to its position to correctly instantiate bullets at the tip of its barrel. The current method only considers the position of the gun, not its orientation.

In Three.js, an object’s position in space is determined by its position property, but its orientation (the direction it’s facing) is determined by its rotation or quaternion properties. When you instantiate a bullet at the gun’s position, you also need to apply the gun’s orientation to ensure the bullet starts at the correct location and travels in the right direction.

Here’s how you can update your method to create bullets that spawn at the tip of the gun and move in the correct direction:

  1. Use the Gun’s World Position: Instead of using the gun’s local position, you may want to use its world position if the gun is a child of another moving object. This ensures you’re getting the absolute position in the scene.
  2. Calculate Bullet Initial Position: Consider the gun’s orientation and the distance from its base to the tip of the barrel to calculate the exact spawn point for bullets.
  3. Apply Direction: Ensure the bullet is oriented in the same direction as the gun. This can involve copying the gun’s rotation or using a forward vector.

Below is a pseudocode illustrating these steps:

if (this.positionReference) {
    // Obtain world position and rotation (quaternion) of the gun
    const gunWorldPosition = new THREE.Vector3();
    const gunWorldQuaternion = new THREE.Quaternion();
    this.positionReference.getWorldPosition(gunWorldPosition);
    this.positionReference.getWorldQuaternion(gunWorldQuaternion);

    // Assuming we know the offset from the gun's base to the tip of the barrel
    const barrelTipOffset = new THREE.Vector3(0, 0, -1); // Adjust this value based on your gun model

    // Use the quaternion to rotate the offset to point in the correct direction
    barrelTipOffset.applyQuaternion(gunWorldQuaternion);

    // Add the rotated offset to the gun's world position to get the spawn point
    const bulletSpawnPosition = gunWorldPosition.add(barrelTipOffset);

    this.shoot(bulletSpawnPosition, gunWorldQuaternion); // Adjust shoot method to accept position and orientation
}
else {
    console.log("Gun object not found");
}

This example assumes shoot is a method you will adjust to accept both a position and an orientation for where and how bullets are instantiated. Note the use of getWorldPosition and getWorldQuaternion methods to ensure you’re working with absolute values in the world space, and the addition of an offset to account for the length of the gun barrel.

Remember to adjust barrelTipOffset based on your model’s specifics—the direction and length from the gun’s origin to the tip of the barrel.

1 replies left - GPT 4
thread_5aRmIARGp75ofWQSQT2bsTiJ
Reply to this message to continue the conversation

Not working, because shoot needs two Vector3, this is my methot called shoot:

private onMouseClick = (event: MouseEvent) => {
if (!document.pointerLockElement && event.target !== this.context.renderer.domElement) return;
if (isMobileDevice()) return; // ignore desktop input on mobile

    if (event.button !== 0) // if not the LMB or primary, abort
        return;
    this.fire();

    //const myPosition : Vector3 = new Vector3(0, 0, 0);
    //const myPosition : Vector3 = new Vector3(this.startPosition);

    //this.myObjectReference = this.gameObject.position.clone(); 

    // Instantiate the object at the position of 'positionReference'

    if (this.positionReference) 
    {
        // Obtain world position and rotation (quaternion) of the gun
        const gunWorldPosition = new THREE.Vector3();
        const gunWorldQuaternion = new THREE.Quaternion();
        this.positionReference.getWorldPosition(gunWorldPosition);
        this.positionReference.getWorldQuaternion(gunWorldQuaternion);

        // Assuming we know the offset from the gun's base to the tip of the barrel
        const barrelTipOffset = new THREE.Vector3(0, 0, -1); // Adjust this value based on your gun model

        // Use the quaternion to rotate the offset to point in the correct direction
        barrelTipOffset.applyQuaternion(gunWorldQuaternion);

        // Add the rotated offset to the gun's world position to get the spawn point
        const bulletSpawnPosition = gunWorldPosition.add(barrelTipOffset);

        this.shoot(bulletSpawnPosition, bulletSpawnPosition); // Adjust shoot method to accept position and orientation
    }
    else{
        console.log("Nada");
    }
    // Adjust the position if necessary, for now it inherits the position from 'positionReference'
    // instance.position.set(...) if you need to adjust the position further

    //const myPosition : Vector3 = myObjectReference;
    
    // this.shoot(spawnerPos, spawnerPos);
}

/**
* shoot an arrow
* @param from position to shoot from
* @param vec direction to shoot (not normalized)
*/
private async shoot(from: Vector3, vec: Vector3) {
if (!this.arrowPrefab) return;
const instance = await this.arrowPrefab.instantiate({ parent: this.context.scene });
const force = Math.pow(vec.length() + .5, 2);
const dir = vec.clone().normalize();
if (instance) {
instance.position.copy(from);
instance.lookAt(dir.clone().add(from));
instance.visible = true;
const rb = instance.getOrAddComponent(Rigidbody);
rb.isKinematic = false;
rb.autoMass = false;
rb.mass = .05;
this.sound?.stop();
this.sound?.play();
// workaround Rigidbody not yet created in the physics engine (it gets created in onEnable)
//wait delayForFrames(1);
rb.applyImpulse(dir.multiplyScalar(force), true);
}
}

Given that your shoot method requires two Vector3 parameters, and assuming the first parameter is for the position where the bullet is spawned and the second parameter is for the direction in which the bullet should travel, you’ll need to calculate both values correctly.

Since the bullets should originate from the tip of the gun barrel and travel in the direction the gun is pointed, you calculate the spawn position as before but adjust how you determine the direction vector. The direction can be derived from the gun’s orientation, specifically using forward vector logic. Here’s how you can approach it:

  1. Calculate the spawn position for the bullet at the gun barrel’s tip, just like before.
  2. Calculate the forward direction from the gun’s orientation.

The modified code snippet below reflects these changes:

if (this.positionReference) {
    // Obtain world position and rotation (quaternion) of the gun
    const gunWorldPosition = new THREE.Vector3();
    const gunWorldQuaternion = new THREE.Quaternion();
    this.positionReference.getWorldPosition(gunWorldPosition);
    this.positionReference.getWorldQuaternion(gunWorldQuaternion);

    // Assuming the offset from the gun's base to the tip of the barrel
    const barrelTipOffset = new THREE.Vector3(0, 0, -1); // Adjust based on the model

    // Use the quaternion to rotate the offset correctly
    barrelTipOffset.applyQuaternion(gunWorldQuaternion);

    // Calculate the spawn point of the bullet
    const bulletSpawnPosition = gunWorldPosition.add(barrelTipOffset);

    // Determine the forward direction from the gun's orientation
    const forwardDirection = new THREE.Vector3(0, 0, 1).applyQuaternion(gunWorldQuaternion);

    // Use bulletSpawnPosition for the position parameter
    // Use forwardDirection for the direction parameter
    this.shoot(bulletSpawnPosition, forwardDirection);
} else {
    console.log("Gun object not found");
}

In the code above, forwardDirection is calculated by applying the gun’s orientation (gunWorldQuaternion) to a vector pointing forwards relative to the gun. This assumes the gun’s ‘forward’ direction is along the positive Z-axis; you might need to adjust this vector if your model uses a different axis convention for ‘forward’.

These changes should ensure that the bullet is spawned at the tip of the gun’s barrel and moves in the direction the gun is pointing.

0 replies left - GPT 4
thread_5aRmIARGp75ofWQSQT2bsTiJ
Reply to this message to continue the conversation

Please dont ask the same question in multiple locations.