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;
}







1












$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.



Three-dimensional possible directions



Should I convert Quaternion to EulerAngles



Quaternion randomRotation = Random.rotation;    
Vector3 inEuler = randomRotation.eulerAngles;


or is there a fairer / nicer way to do it?










share|improve this question









New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$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


















1












$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.



Three-dimensional possible directions



Should I convert Quaternion to EulerAngles



Quaternion randomRotation = Random.rotation;    
Vector3 inEuler = randomRotation.eulerAngles;


or is there a fairer / nicer way to do it?










share|improve this question









New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$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














1












1








1


1



$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.



Three-dimensional possible directions



Should I convert Quaternion to EulerAngles



Quaternion randomRotation = Random.rotation;    
Vector3 inEuler = randomRotation.eulerAngles;


or is there a fairer / nicer way to do it?










share|improve this question









New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$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.



Three-dimensional possible directions



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#






share|improve this question









New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 14 hours ago









Alexandre Vaillancourt

12.8k114149




12.8k114149






New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 18 hours ago









EIRU.EIRU.

85




85




New contributor




EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






EIRU. is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












  • $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




$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










1 Answer
1






active

oldest

votes


















4












$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.






share|improve this answer









$endgroup$














    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.










    draft saved

    draft discarded


















    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









    4












    $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.






    share|improve this answer









    $endgroup$


















      4












      $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.






      share|improve this answer









      $endgroup$
















        4












        4








        4





        $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.






        share|improve this answer









        $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.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 16 hours ago









        DMGregoryDMGregory

        64.8k16115180




        64.8k16115180






















            EIRU. is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            How to label and detect the document text images

            Vallis Paradisi

            Tabula Rosettana