Page 1 of 2

PitchTo()

Posted: Wed Mar 07, 2018 6:24 pm
by Matt
This could be done by other means, but it would be nice not to have to do a distance calculation and arctangent lookup in the VM.

Re: PitchTo()

Posted: Wed Mar 07, 2018 6:56 pm
by Major Cooke
Specifically? Towards another actor or towards a point?

Re: PitchTo()

Posted: Wed Mar 07, 2018 7:16 pm
by Matt
AngleTo() is towards an actor but arbitrary point would be nice! (and preferable)

It really is just atan( (pos.z-other.pos.z) / distance2d(other)), but now that I type this out it does seem like quite a few VM instructions.

Re: PitchTo()

Posted: Thu Mar 08, 2018 4:24 pm
by Apeirogon
Matt wrote:atan( (pos.z-other.pos.z) / distance2d(other))
"Why walk, if you could ride astride?" Silt Strider chasseur quote

Code: Select all

extend class Actor
{
	void A_PosAttack()
	{
		if (target)
		{
			A_FaceTarget();
			double ang = angle;
			double slope = AimLineAttack(ang, MISSILERANGE);
			A_PlaySound("grunt/attack", CHAN_WEAPON);
			ang  += Random2[PosAttack]() * (22.5/256);
			int damage = Random[PosAttack](1, 5) * 3;
			LineAttack(ang, MISSILERANGE, slope, damage, "Hitscan", "Bulletpuff");
		}
	}

Re: PitchTo()

Posted: Thu Mar 08, 2018 5:02 pm
by Major Cooke
...What was the point of your post?

Anyway, Matt, one thing you could do in the mean time is use A_Face and set the angle limit to something non-zero.

Re: PitchTo()

Posted: Fri Mar 09, 2018 7:33 am
by Apeirogon
All defined in zscript, inside gzdoom pack, hitscan enemy use "aim line attack" to get slope/pitch to it target, not arctangent of distance and positions.
So, I think, this is the quickest way to get pitch/slope to some actor.

Re: PitchTo()

Posted: Mon Mar 12, 2018 1:49 pm
by Matt
Major Cooke wrote:Anyway, Matt, one thing you could do in the mean time is use A_Face and set the angle limit to something non-zero.
That's pretty much what I'm doing now - storing a backup pitch and angle, calling A_Face, recording the new pitch and resetting the pitch and angle.

Re: PitchTo()

Posted: Mon Mar 12, 2018 3:04 pm
by Gutawer
You can do this via something like this:

Code: Select all

Vector3 dirTo = vec3To(other).unit();
double angleTo = atan2(dirTo.y, dirTo.x);
double pitchTo = -asin(dirTo.z);
You can of course take out the angleTo line if it's unnecessary.

Re: PitchTo()

Posted: Mon Mar 12, 2018 3:59 pm
by Major Cooke
He's trying to have this be made done on the engine side to reduce calculations on the VM side, correct me if I'm wrong.

Re: PitchTo()

Posted: Tue Mar 13, 2018 12:05 am
by Matt
That is correct.

Re: PitchTo()

Posted: Mon Aug 20, 2018 6:40 pm
by argv
I've submitted pull request #553 which, if merged, will do what you need. See forum post for an example.

Re: PitchTo()

Posted: Tue Aug 21, 2018 12:23 am
by Graf Zahl
I'd rather do this natively for performance reasons.

Re: PitchTo()

Posted: Thu Aug 30, 2018 3:30 am
by Apeirogon
Before try to make something like this I wonder does distance(2/3)d more performance wise than cos/sin(arctan(number) )?

Re: PitchTo()

Posted: Sun May 17, 2020 4:50 am
by Accensus
Bumperino. Will this get added natively or will it remain DIY?

Re: PitchTo()

Posted: Mon May 18, 2020 8:15 pm
by Matt
Would it even make a performance difference anymore nowadays?