How do I implement bullet spread in three-dimensional space?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
$begingroup$
How can I shoot a bullet in three-dimensional space in such a way that its path diverges a bit, randomly, from the direction in which the gun is pointed?
I know I have to use the Quaternions, but I don't know how exactly.
Should I convert Quaternion to EulerAngles
Quaternion randomRotation = Random.rotation;
Vector3 inEuler = randomRotation.eulerAngles;
or is there a fairer / nicer way to do it?
unity c#
New contributor
$endgroup$
add a comment |
$begingroup$
How can I shoot a bullet in three-dimensional space in such a way that its path diverges a bit, randomly, from the direction in which the gun is pointed?
I know I have to use the Quaternions, but I don't know how exactly.
Should I convert Quaternion to EulerAngles
Quaternion randomRotation = Random.rotation;
Vector3 inEuler = randomRotation.eulerAngles;
or is there a fairer / nicer way to do it?
unity c#
New contributor
$endgroup$
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago
add a comment |
$begingroup$
How can I shoot a bullet in three-dimensional space in such a way that its path diverges a bit, randomly, from the direction in which the gun is pointed?
I know I have to use the Quaternions, but I don't know how exactly.
Should I convert Quaternion to EulerAngles
Quaternion randomRotation = Random.rotation;
Vector3 inEuler = randomRotation.eulerAngles;
or is there a fairer / nicer way to do it?
unity c#
New contributor
$endgroup$
How can I shoot a bullet in three-dimensional space in such a way that its path diverges a bit, randomly, from the direction in which the gun is pointed?
I know I have to use the Quaternions, but I don't know how exactly.
Should I convert Quaternion to EulerAngles
Quaternion randomRotation = Random.rotation;
Vector3 inEuler = randomRotation.eulerAngles;
or is there a fairer / nicer way to do it?
unity c#
unity c#
New contributor
New contributor
edited 14 hours ago
Alexandre Vaillancourt♦
12.8k114149
12.8k114149
New contributor
asked 18 hours ago
EIRU.EIRU.
85
85
New contributor
New contributor
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago
add a comment |
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
Should I convert Quaternion to EulerAngles
No, going to EulerAngles makes most things worse.
Try something like this instead:
Vector3 PickFiringDirection(Vector3 muzzleForward, float spreadRadius) {
Vector3 candidate = Random.insideUnitSphere * spreadRadius + muzzleForward;
return candidate.normalized;
}
Here we pick a random vector offset to add to the end of our nominal shooting direction, then normalize it so the result is still a unit vector.
There are more ways to pick a random vector in-line with our shooting direction or only slightly deviating from it than there are to pick a highly perpendicular offset, so this will give a distribution where most shots go toward the middle of the cone, and outliers hitting the edges of the cone are more rare.
Your spreadRadius
is roughly the radius of the cone 1 unit from the muzzle, or roughly Mathf.Tan(Mathf.Deg2Rad * angle/2f)
where angle
is the divergence between opposite sides of the cone.
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "53"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
EIRU. is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgamedev.stackexchange.com%2fquestions%2f169893%2fhow-do-i-implement-bullet-spread-in-three-dimensional-space%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Should I convert Quaternion to EulerAngles
No, going to EulerAngles makes most things worse.
Try something like this instead:
Vector3 PickFiringDirection(Vector3 muzzleForward, float spreadRadius) {
Vector3 candidate = Random.insideUnitSphere * spreadRadius + muzzleForward;
return candidate.normalized;
}
Here we pick a random vector offset to add to the end of our nominal shooting direction, then normalize it so the result is still a unit vector.
There are more ways to pick a random vector in-line with our shooting direction or only slightly deviating from it than there are to pick a highly perpendicular offset, so this will give a distribution where most shots go toward the middle of the cone, and outliers hitting the edges of the cone are more rare.
Your spreadRadius
is roughly the radius of the cone 1 unit from the muzzle, or roughly Mathf.Tan(Mathf.Deg2Rad * angle/2f)
where angle
is the divergence between opposite sides of the cone.
$endgroup$
add a comment |
$begingroup$
Should I convert Quaternion to EulerAngles
No, going to EulerAngles makes most things worse.
Try something like this instead:
Vector3 PickFiringDirection(Vector3 muzzleForward, float spreadRadius) {
Vector3 candidate = Random.insideUnitSphere * spreadRadius + muzzleForward;
return candidate.normalized;
}
Here we pick a random vector offset to add to the end of our nominal shooting direction, then normalize it so the result is still a unit vector.
There are more ways to pick a random vector in-line with our shooting direction or only slightly deviating from it than there are to pick a highly perpendicular offset, so this will give a distribution where most shots go toward the middle of the cone, and outliers hitting the edges of the cone are more rare.
Your spreadRadius
is roughly the radius of the cone 1 unit from the muzzle, or roughly Mathf.Tan(Mathf.Deg2Rad * angle/2f)
where angle
is the divergence between opposite sides of the cone.
$endgroup$
add a comment |
$begingroup$
Should I convert Quaternion to EulerAngles
No, going to EulerAngles makes most things worse.
Try something like this instead:
Vector3 PickFiringDirection(Vector3 muzzleForward, float spreadRadius) {
Vector3 candidate = Random.insideUnitSphere * spreadRadius + muzzleForward;
return candidate.normalized;
}
Here we pick a random vector offset to add to the end of our nominal shooting direction, then normalize it so the result is still a unit vector.
There are more ways to pick a random vector in-line with our shooting direction or only slightly deviating from it than there are to pick a highly perpendicular offset, so this will give a distribution where most shots go toward the middle of the cone, and outliers hitting the edges of the cone are more rare.
Your spreadRadius
is roughly the radius of the cone 1 unit from the muzzle, or roughly Mathf.Tan(Mathf.Deg2Rad * angle/2f)
where angle
is the divergence between opposite sides of the cone.
$endgroup$
Should I convert Quaternion to EulerAngles
No, going to EulerAngles makes most things worse.
Try something like this instead:
Vector3 PickFiringDirection(Vector3 muzzleForward, float spreadRadius) {
Vector3 candidate = Random.insideUnitSphere * spreadRadius + muzzleForward;
return candidate.normalized;
}
Here we pick a random vector offset to add to the end of our nominal shooting direction, then normalize it so the result is still a unit vector.
There are more ways to pick a random vector in-line with our shooting direction or only slightly deviating from it than there are to pick a highly perpendicular offset, so this will give a distribution where most shots go toward the middle of the cone, and outliers hitting the edges of the cone are more rare.
Your spreadRadius
is roughly the radius of the cone 1 unit from the muzzle, or roughly Mathf.Tan(Mathf.Deg2Rad * angle/2f)
where angle
is the divergence between opposite sides of the cone.
answered 16 hours ago
DMGregory♦DMGregory
64.8k16115180
64.8k16115180
add a comment |
add a comment |
EIRU. is a new contributor. Be nice, and check out our Code of Conduct.
EIRU. is a new contributor. Be nice, and check out our Code of Conduct.
EIRU. is a new contributor. Be nice, and check out our Code of Conduct.
EIRU. is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Game Development Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgamedev.stackexchange.com%2fquestions%2f169893%2fhow-do-i-implement-bullet-spread-in-three-dimensional-space%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
A quick search reveals that "bullet spread" seems to be an invention of video games developers. I formalized what you seemed to be after.
$endgroup$
– Alexandre Vaillancourt♦
14 hours ago