मैं किसी अन्य वस्तु के आधार पर किसी वस्तु को कैसे घुमा सकता हूं?


25

मेरे पास एक बुर्ज का 3 डी मॉडल है जो वाई-अक्ष के चारों ओर घूमता है। इस बुर्ज में एक तोप है जो वस्तु के केंद्र से काफी दूर है। मैं तोप चाहता हूं, बुर्ज नहीं, एक निर्दिष्ट लक्ष्य पर निशाना लगाने के लिए। हालाँकि, मैं केवल बुर्ज घुमा सकता हूँ, और इस प्रकार मुझे नहीं पता है कि उद्देश्य द्वारा पूरा करने के लिए मुझे किस समीकरण को लागू करने की आवश्यकता है।

निम्नलिखित छवि मेरी समस्या को दर्शाती है:यहाँ छवि विवरण दर्ज करें

अगर मेरे पास टारगेट "लुकअट ()" लक्ष्य है, तो तोप से निकलने वाला एक लेजर पूरी तरह से कहा गया निशाना चूक जाएगा।

यदि यह पूरी तरह से टॉप-डाउन परिदृश्य था, और तोप बुर्ज के समानांतर थी, तो मेरा तर्क मुझे बताता है कि नकली लक्ष्य एक ऐसी स्थिति में होना चाहिए जो वास्तविक लक्ष्य के बराबर हो और एक ऑफसेट जो कि उस के बीच बराबर हो बुर्ज और तोप। हालाँकि, मेरे वास्तविक परिदृश्य में, मेरा कैमरा 60 and कोण का है, और तोप में थोड़ा घुमाव है।

निम्न छवि परिदृश्य को दर्शाती है: चित्रण परिदृश्य

मुझे यकीन नहीं है कि ऐसा क्यों है, लेकिन अगर मैं उसी ऑफसेट को लागू करता हूं, तो यह केवल बुर्ज से कुछ दूरी पर लक्ष्य बनाते हुए काम करता है।

क्या मेरा तर्क त्रुटिपूर्ण है? क्या मुझे यहाँ कुछ मौलिक याद आ रही है?

अंतिम संपादन: @ जोहान हैमिल्टन द्वारा प्रदान किया गया समाधान नवीनतम अद्यतन इस समस्या को पूर्ण सटीकता के साथ हल करता है। मैंने अब उस कोड और चित्र को हटा दिया है जिसका उपयोग मैंने अपने गलत क्रियान्वयन के लिए किया था।


हथियारों के डिजाइन के नजरिए से, आप अपनी बंदूक को ठीक कर सकते हैं ;)
वेन वर्नर

@WayneWerner मेरे मामले में यह एक विकल्प नहीं है। यह एक डिजाइन विकल्प है कि यह टेढ़ा हो, लेकिन कार्यात्मक हो।
फ्रेंकस्टीन

1
मैंने अपने उत्तर में एक कार्यशील उदाहरण जोड़ा है ।
ens

ऐसा लगता है कि उत्तर एकदम सही हैं ... क्या आप उल्लेख कर सकते हैं कि आपको किस विवरण की आवश्यकता है?
सैय्यद मोर्तेजा कमली

जवाबों:


31

यदि आप गणित करते हैं तो उत्तर वास्तव में बहुत आसान है। आपके पास Y की एक निश्चित दूरी और X की एक चर दूरी है (चित्र 1 देखें)। आपको जेड और एक्स के बीच के कोण का पता लगाने और अपने बुर्ज को और अधिक मोड़ने की आवश्यकता है। यहाँ छवि विवरण दर्ज करें

चरण 1 - बुर्ज लाइन (वी) और बंदूक लाइन (डब्ल्यू) के बीच की दूरी प्राप्त करें जो वाई है (यह स्थिर है लेकिन गणना करने के लिए चोट नहीं करता है)। बुर्ज से लक्ष्य तक दूरी प्राप्त करें (जो कि X है)।

चरण 2 - वाई को एक्स से विभाजित करें और फिर मूल्य के हाइपरबोलेनिक साइन प्राप्त करें

double turnRadians = Mathf.Asin(Y/X);
double angle = Mathf.Rad2Deg * turnRadians;

//where B is the red dot, A is a point on the X line and C is a point on the Z line.

चरण 3 - बुर्ज को और अधिक मोड़ें (अक्ष के चारों ओर जो इसके ऊपर से नीचे तक जाता है, सबसे अधिक संभावना धुरी है लेकिन केवल आप उस हिस्से को जान सकते हैं)।

gameObject.transform.Rotate(Vector3.up, turnAngle);

बेशक, इस मामले में, आपको इसे वामावर्त चालू करने की आवश्यकता है, इसलिए आपको टर्नअंगल के सामने माइनस जोड़ने की आवश्यकता हो सकती है, जैसे कि अंदर -turnAngle

कुछ हिस्सों को संपादित किया। दूरी में अंतर को इंगित करने के लिए @ लेंस के लिए धन्यवाद।

ओपी ने कहा कि उनकी बंदूक में एक कोण है इसलिए हम यहां जाते हैं, पहले छवि, बाद में स्पष्टीकरण: यहाँ छवि विवरण दर्ज करें

हम पिछली गणना से पहले से ही जानते हैं कि नीली रेखा के अनुसार लाल रेखा का लक्ष्य कहां है। तो पहले नीली रेखा के लिए लक्ष्य:

float turnAngle = angleBetweenTurretAndTarget - angleBetweenTurretAndGun;
turret.transform.Rotate(Vector3.up, turnAngle);

यहां जो एकमात्र गणना अलग है, वह "एक्स प्राइम" (एक्स ') की गणना है क्योंकि बंदूक और बुर्ज (कोण "ए") के बीच के कोण ने लाइनों के बीच की दूरी को बदल दिया है।

//(this part had a mistake of using previous code inside new variable names, YPrime and Y are shown as X' and X in the 2nd picture.
float YPrime = Cos(a)*Y; //this part is what @ens is doing in his answer
double turnRadians = Mathf.Asin(YPrime/X);
double angle = Mathf.Rad2Deg * turnRadians;
turret.transform.Rotate(Vector3.up, angle);

यदि आप बुर्ज बंदूकें मॉड्यूलर कर रहे हैं (यानी उपयोगकर्ता एक बुर्ज पर बंदूकें बदल सकते हैं और अलग-अलग कोणों में अलग-अलग कोण हैं) तो यह अगला भाग केवल आवश्यक है। यदि आप संपादक में ऐसा कर रहे हैं, तो आप पहले से ही देख सकते हैं कि बुर्ज के अनुसार बंदूक का कोण क्या है।

"ए" को खोजने के लिए दो विधियाँ हैं, एक है ट्रांसफॉर्म.अप विधि:

float angleBetween = Vector3.Angle(turret.transform.up, gun.transform.up);

उपरोक्त तकनीक 3 डी में गणना करेगी, इसलिए यदि आप एक 2 डी परिणाम चाहते हैं, तो आपको जेड अक्ष से छुटकारा पाने की आवश्यकता है (यह वही है जो मैं मानता हूं कि गुरुत्वाकर्षण कहां है, लेकिन यदि आपने कुछ भी नहीं बदला, तो एकता में यह वाई अक्ष है जो ऊपर या नीचे है) यानी गुरुत्वाकर्षण Y अक्ष पर है, इसलिए आपको चीजें बदलनी पड़ सकती हैं):

Vector2 turretVector = new Vector2(turret.transform.up.x, turret.transform.up.y);
Vector2 gunVector = new Vector2(gun.transform.up.x, gun.transform.up.y);
float angleBetween = Vector2.Angle(turretVector, gunVector);

दूसरा तरीका रोटेशन विधि है (मैं इस मामले में 2 डी में सोच रहा हूं):

double angleRadians = Mathf.Asin(turret.transform.rotation.z - gun.transform.rotation.z);
double angle = 2 * Mathf.Rad2Deg * angleRadians;

फिर से, ये सभी कोड आपको मान देंगे जो सकारात्मक हैं, इसलिए आपको कोण के आधार पर राशि को जोड़ना या घटाना हो सकता है (इसके लिए गणना भी होती है, लेकिन मैं उस गहराई में नहीं जा सकता हूं)। इस पर शुरू करने के लिए एक अच्छी जगह Vector2.Dotएकता में विधि होगी ।

हम क्या कर रहे हैं, इसके अतिरिक्त विवरण के लिए कोड का अंतिम ब्लॉक:

//turn turret towards target
turretTransform.up = targetTransform.position - turretTransform.position;
//adjust for gun angle
if (weaponTransform.localEulerAngles.z <180) //if the value is over 180 it's actually a negative for us
    turretTransform.Rotate(Vector3.forward, 90 - b - a);
else
    turretTransform.Rotate(Vector3.forward, 90 - b + a);

यदि आपने सब कुछ सही किया है, तो आपको इस तरह का दृश्य मिलना चाहिए ( unitypackage के लिए लिंक ): यहाँ छवि विवरण दर्ज करें मुझे हमेशा सकारात्मक मूल्यों से क्या मतलब है:यहाँ छवि विवरण दर्ज करें

Z विधि नकारात्मक मान दे सकती है:यहाँ छवि विवरण दर्ज करें

एक उदाहरण के दृश्य के लिए, इस लिंक से एकता प्राप्त करें

यहाँ मैंने दृश्य में (बुर्ज पर) कोड का उपयोग किया है:

public class TurretAimCorrection : MonoBehaviour
{
    public Transform targetTransform;
    public Transform turretTransform;
    public Transform weaponTransform;

    private float f, d, x, y, h, b, a, weaponAngle, turnAngle;
    private void Start()
    {
        TurnCorrection();
    }

    private void Update()
    {
        TurnCorrection();
    }
    void TurnCorrection()
    {
        //find distances and angles
        d = Vector2.Distance(new Vector2(targetTransform.position.x, targetTransform.position.y), new Vector2(turretTransform.position.x, turretTransform.position.y));
        x = Vector2.Distance(new Vector2(turretTransform.position.x, turretTransform.position.y), new Vector2(weaponTransform.position.x, weaponTransform.position.y));
        weaponAngle = weaponTransform.localEulerAngles.z;
        weaponAngle = weaponAngle * Mathf.Deg2Rad;
        y = Mathf.Abs(Mathf.Cos(weaponAngle) * x);
        b = Mathf.Rad2Deg * Mathf.Acos(y / d);
        a = Mathf.Rad2Deg * Mathf.Acos(y / x);
        //turn turret towards target
        turretTransform.up = targetTransform.position - turretTransform.position;
        //adjust for gun angle
        if (weaponTransform.localEulerAngles.z < 180)
            turretTransform.Rotate(Vector3.forward, 90 - b - a);
        else
            turretTransform.Rotate(Vector3.forward, 90 - b + a);
        //Please leave this comment in the code. This code was made by 
        //http://gamedev.stackexchange.com/users/93538/john-hamilton a.k.a. CrazyIvanTR. 
        //This code is provided as is, with no guarantees. It has worked in local tests on Unity 5.5.0f3.
    }
}

2 डी प्लेन के रूप में X और Z के साथ 3D अनुकूलित कोड:

public class TurretAimCorrection : MonoBehaviour
{
    public Transform targetTransform; //drag target here
    public Transform turretTransform; //drag turret base or turret top part here
    public Transform weaponTransform; //drag the attached weapon here

    private float d, x, y, b, a, weaponAngle, turnAngle;
    private void Start()
    {
        TurnAdjustment();
    }

    private void Update()
    {
        TurnAdjustment();
    }
    void TurnAdjustment()
    {

        d = Vector2.Distance(new Vector2(targetTransform.position.x, targetTransform.position.z), new Vector2(turretTransform.position.x, turretTransform.position.z));
        x = Vector2.Distance(new Vector2(turretTransform.position.x, turretTransform.position.z), new Vector2(weaponTransform.position.x, weaponTransform.position.z));
        weaponAngle = weaponTransform.localEulerAngles.y;
        weaponAngle = weaponAngle * Mathf.Deg2Rad;
        y = Mathf.Abs(Mathf.Cos(weaponAngle) * x);
        b = Mathf.Rad2Deg * Mathf.Acos(y / d);
        a = Mathf.Rad2Deg * Mathf.Acos(y / x);
        //turn turret towards target
        turretTransform.forward = new Vector3(targetTransform.position.x, 0, targetTransform.position.z) - new Vector3(turretTransform.position.x, 0, turretTransform.position.z);
        //adjust for gun angle
        if (weaponTransform.localEulerAngles.y < 180)
            turretTransform.Rotate(Vector3.up, - a +b-90);
        else
            turretTransform.Rotate(Vector3.up, + a+ b - 90);
        //Please leave this comment in the code. This code was made by 
        //http://gamedev.stackexchange.com/users/93538/john-hamilton a.k.a. CrazyIvanTR. 
        //This code is provided as is, with no guarantees. It has worked in local tests on Unity 5.5.0f3.
    }
}

पहली छवि में थोड़ी सी खामी है। Z बॉक्स के बुर्ज की लंबाई है। रोटेशन के बाद बॉक्स के बुर्ज की लंबाई X है ... x = z। इसलिए, जब तक y वह कर्ण नहीं है जो एक सही त्रिकोण नहीं है और पाप लागू नहीं होता है।
द ग्रेट डक

@ TheGreatDuck Z बुर्ज और बॉक्स के बीच की दूरी नहीं है, यह उस बुर्ज का वेक्टर 2 है। यह अंत में एक तीर होने के बजाय इसे केवल परिमित दिखाया गया है। भले ही Z दूरी थी, चित्र में इकाइयाँ हैं और आप उस Z <X को बिना गणना किए भी देख सकते हैं।
जॉन हैमिल्टन

2
@ फ्रेंकस्टीन आपको पहले बुर्ज को चालू करने की आवश्यकता नहीं है, फिर इन्हें लागू करें। आप पहले इन की गणना कर सकते हैं, फिर इन समीकरणों से प्राप्त डिग्री को बुर्ज की टर्न डिग्री में जोड़ सकते हैं। (इसलिए बुर्ज को ऑब्जेक्ट के लिए 20 डिग्री तक मोड़ने के बजाय, फिर बंदूक के लिए समायोजित करके, आप बंदूक के लिए 20 डिग्री + समायोजन द्वारा बुर्ज को चालू करेंगे)।
जॉन हैमिल्टन

@Franconstein नया समायोजित कोड देखें। चूंकि हमने विमानों को बदल दिया था इसलिए कोड दूसरे संस्करण की तुलना में अलग तरह से काम कर रहा था। मुझे नहीं पता कि ऐसा क्यों हुआ लेकिन यह अब मेरे अंत पर पूरी तरह से काम कर रहा है। देखें: imgur.com/a/1scEH (अपने बुर्ज को हटाना आवश्यक नहीं था, उन सरल मॉडल ने आपकी तरह ही अभिनय किया)।
जॉन हैमिल्टन

1
@ जॉन हैमिल्टन आपने यह किया है! यह अंततः हल हो गया है, और लेजर जैसी परिशुद्धता के साथ भी! धन्यवाद! धन्यवाद! धन्यवाद! अब मैं अपने पोस्ट को संपादित करूँगा कि यह शुरुआत में कैसा था, इसलिए इसे भविष्य के संदर्भ के लिए अधिक आसानी से समझा जा सकता है! एक बार और, धन्यवाद!
फ्रेंकस्टीन

3

आप अधिक सामान्य दृष्टिकोण का भी उपयोग कर सकते हैं:

आपकी समस्या का गणित पहले से ही स्केलरप्रोडक्ट (या डॉट उत्पाद) के रूप में मौजूद है । आपको केवल अपने हथियारों के आगे की धुरी की दिशा और अपने हथियार से लक्ष्य की दिशा प्राप्त करने की आवश्यकता है।

W अपने हथियार को आगे बढ़ाने वाले वेक्टर बनें।

डी को अपने हथियार से अपने लक्ष्य तक दिशा दें। (टारगेट.पोज़ - वेपन.पोज़)

अगर आप डॉट प्रोडक्ट का फॉर्मूला हल करते हैं

dot(A,B) = |A|*|B|*cos(alpha) with alpha = the angle between A and B

अल्फा के लिए, आपको मिलता है:

              ( dot(W,D) )
alpha = arccos(--------- )
              ( |W|*|D|  )

आपको केवल रेडियंस को डिग्री में बदलना होगा और आपको अपने रोबोट को घुमाने के लिए अपना कोण मिलेगा। (जैसा कि आपने उल्लेख किया है कि हथियार आपके रोबोट के कोण पर है, इसलिए आपको कोण को अल्फा में जोड़ने की आवश्यकता है)

यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें


2

अब तक पोस्ट किए गए सभी उत्तर (कमोबेश) गलत हैं, इसलिए यहां एक त्वरित सही समाधान है:

यहाँ छवि विवरण दर्ज करें

बंदूक को लक्ष्य की ओर ले जाने के लिए, बुर्ज फॉरवर्ड वेक्टर को लक्ष्य पर घुमाएं और कोण gun जोड़ें।

तो आइए जानें θ:

   d / sin(δ) = a / sin(α) # By the Law of Sines
=> α = asin(a * sin(δ) / d)

   β = 180° - α - δ
   θ = 90° - β
=> θ = α + δ - 90°
     = asin(a * sin(δ) / d) + δ - 90°
     = asin(a * cos') / d) - δ' # Where (δ' = 90° - δ) is the angle between 
                                  # the gun and the turret forward vector.

जब δ' = 0यह सरल हो जाता है θ = asin(a / d), जो जॉन हैमिल्टन के उत्तर के पहले भाग से मेल खाता है।

संपादित करें:

मैंने एक काम करने का उदाहरण जोड़ा है।

JSFiddle में खोलें या नीचे दिए गए एम्बेडेड स्निपेट का उपयोग करें:

var Degree = Math.PI / 180;
var showDebugOverlays = false;

var Turret = {
    gunAngle: -10 * Degree,
    maxGunAngle: 85 * Degree,
    adaptedGunXOffset: null,

    rotateToTarget: function (target) {
        var delta = Vec.subtract(this.position, target.position);
        var dist = Vec.length(delta);
        var angle = Vec.angle(delta);

        theta = Math.asin(this.adaptedGunXOffset / dist) + this.gunAngle;
        this.rotation = -(angle + theta);

        this.updateGunRay(target);
    },

    setGunAngle: function (angle) {
        var angle = this.clampGunAngle(angle);
        this.gunAngle = angle;
        this.gun.rotation = angle;
        // Account for the fact that the origin of the gun also has an y offset
        // relative to the turret origin
        var extraXOffset = this.gun.position.y * Math.tan(angle);
        var gunXOffset = this.gun.position.x + extraXOffset;
        // This equals "a * cos(δ')" in the angle formula
        this.adaptedGunXOffset = gunXOffset * Math.cos(-angle);

        if (showDebugOverlays) {
            // Show x offsets
            this.removeChild(this.xOffsetOverlay);
            this.removeChild(this.extraXOffsetOverlay);
            this.xOffsetOverlay = addRect(this, 0, 0, this.gun.position.x, 1, 0xf6ff00);
            this.extraXOffsetOverlay = addRect(this, this.gun.position.x, 0, extraXOffset, 1, 0xff00ae);
        }
    },

    rotateGun: function (angleDelta) {
        this.setGunAngle(this.gunAngle + angleDelta);
    },

    updateGunRay: function (target) {
        var delta = this.gun.toLocal(target.position);
        var dist = Vec.length(delta);
        this.gun.removeChild(this.gun.ray);
        this.gun.ray = makeLine(0, 0, 0, -dist);
        this.gun.addChildAt(this.gun.ray, 0);
    },

    clampGunAngle: function (angle) {
        if (angle > this.maxGunAngle) {
            return this.maxGunAngle;
        }
        if (angle < -this.maxGunAngle) {
            return -this.maxGunAngle;
        }
        return angle;
    }
}

function makeTurret() {
    var turret = new PIXI.Sprite.fromImage('http://i.imgur.com/gPtlPJh.png');
    var gunPos = new PIXI.Point(25, -25)

    turret.anchor.set(0.5, 0.5);

    var gun = new PIXI.Container();
    var gunImg = new PIXI.Sprite.fromImage('http://i.imgur.com/RE45GEY.png');
    gun.ray = makeLine(0, 0, 0, -250);
    gun.addChild(gun.ray);

    gunImg.anchor.set(0.5, 0.6);
    gun.addChild(gunImg);
    gun.position = gunPos;

    // Turret forward vector
    turret.addChild(makeLine(0, -38, 0, -90, 0x38ce2c));
    turret.addChild(gun);
    turret.gun = gun;

    Object.setPrototypeOf(Turret, Object.getPrototypeOf(turret));
    Object.setPrototypeOf(turret, Turret);

    turret.setGunAngle(turret.gunAngle);

    if (showDebugOverlays) {
        addRect(turret, 0, 0, 1, 1); // Show turret origin
        addRect(gun, -1, 1, 2, 2, 0xff0096); // Show gun origin
    }

    return turret;
}

function makeTarget() {
    var target = new PIXI.Graphics();
    target.beginFill(0xd92f8f);
    target.drawCircle(0, 0, 9);
    target.endFill();
    return target;
}

var CursorKeys = {
    map: { ArrowLeft: -1, ArrowRight: 1 },
    pressedKeyDirection: null,

    onKeyDown: function (keyEvent) {
        var key = this.map[keyEvent.key];
        if (key) {
            this.pressedKeyDirection = key;
        }
    },
    onKeyUp: function (keyEvent) {
        var key = this.map[keyEvent.key];
        if (key) {
            if (this.pressedKeyDirection == key) {
                this.pressedKeyDirection = null;
            }
        }
    }
}

document.body.addEventListener("keydown", CursorKeys.onKeyDown.bind(CursorKeys));
document.body.addEventListener("keyup", CursorKeys.onKeyUp.bind(CursorKeys));

function makeLine(x1, y1, x2, y2, color) {
    if (color == undefined) {
        color = 0x66CCFF;
    }
    var line = new PIXI.Graphics();
    line.lineStyle(1.5, color, 1);
    line.moveTo(x1, y1);
    line.lineTo(x2, y2);
    return line;
}

function addRect(parent, x, y, w, h, color) {
    if (color == undefined) {
        color = 0x66CCFF;
    }
    var rectangle = new PIXI.Graphics();
    rectangle.beginFill(color);
    rectangle.drawRect(x, y, w, h);
    rectangle.endFill();
    parent.addChild(rectangle);
    return rectangle;
}

var Vec = {
    subtract: function (a, b) {
        return { x: a.x - b.x,
                 y: a.y - b.y };
    },
    length: function (v) {
        return Math.sqrt(v.x * v.x + v.y * v.y);
    },
    angle: function (v) {
        return Math.atan2(v.x, v.y)
    }
}

Math.clamp = function(n, min, max) {
    return Math.max(min, Math.min(n, max));
}

var renderer;
var stage;
var turret;
var target;

function run() {
    renderer = PIXI.autoDetectRenderer(600, 300, { antialias: true });
    renderer.backgroundColor = 0x2a2f34;
    document.body.appendChild(renderer.view);
    stage = new PIXI.Container();
    stage.interactive = true;

    target = makeTarget();
    target.position = { x: renderer.width * 0.2, y: renderer.height * 0.3 };

    turret = makeTurret();
    turret.position = { x: renderer.width * 0.65, y: renderer.height * 0.3 };
    turret.rotateToTarget(target);

    stage.addChild(turret);
    stage.addChild(target);

    var message = new PIXI.Text(
        "Controls: Mouse, left/right cursor keys",
        {font: "18px Arial", fill: "#7c7c7c"}
    );
    message.position.set(10, 10);
    stage.addChild(message);

    stage.on('mousemove', function(e) {
        var pos = e.data.global;
        target.position.x = Math.clamp(pos.x, 0, renderer.width);
        target.position.y = Math.clamp(pos.y, 0, renderer.height);
        turret.rotateToTarget(target);
    })

    animate();
}

function animate() {
    requestAnimationFrame(animate);

    if (CursorKeys.pressedKeyDirection) {
        turret.rotateGun(3 * Degree * CursorKeys.pressedKeyDirection);
        turret.rotateToTarget(target);
    }

    renderer.render(stage);
}

run();
body {
    padding: 0;
    margin: 0;
}

#capture_focus {
  position: absolute;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.2.2/pixi.min.js"></script>
<div id="capture_focus" />


इस स्पष्टीकरण के लिए बहुत-बहुत धन्यवाद। मेरे लिए यह समझना काफी सरल था, और यह हर स्थिति को ध्यान में रखता है। हालांकि, जब मैंने इसे लागू किया, तो मुझे जो परिणाम मिले, वह अनुकूल नहीं थे। मैंने अपने कोड को शामिल करने के लिए अपनी मूल पोस्ट को संपादित किया है, एक छवि जो मेरे सेटअप की कल्पना कर रही है, और प्रत्येक चर के लिए परिणाम। मेरा बुर्ज आगे का वेक्टर हमेशा लक्ष्य को देख रहा है, लेकिन अगर ऐसा नहीं है, तो भी परिणाम लगभग समान ही रहते हैं। क्या मुझसे कुछ ग़लत हो रहा है? क्या यह मेरा कोड है?
फ्रेंकस्टीन

यदि अन्य उत्तर "अधिक या कम गलत हैं", तो आप उन्हें सही ढंग से समझ / लागू नहीं करते हैं। मैंने वांछित व्यवहार बनाने के लिए, पहले दोनों वैकल्पिक उत्तर का उपयोग किया है। @ फ्रेंकस्टीन, मैं यहां तक ​​कि कम से कम आपकी टिप्पणियों को देख कर कहता हूं कि आपने सत्यापित किया है कि यह काम करता है। यदि आपने कोई समाधान सत्यापित किया है, तो क्या आपको अभी भी कोई समस्या है?
Gnemlock

@Gnemlock, जॉन हैमिल्टन का समाधान गलत नहीं था - मैंने इसे लागू किया, और इसने काम किया, और इस तरह मैंने उनके समाधान को अनुमोदित के रूप में सत्यापित किया। लेकिन इसे लागू करने के बाद, मैंने विभिन्न गैर-स्थैतिक परिदृश्यों की कोशिश करना शुरू कर दिया, और समाधान पकड़ में नहीं आया। मैं समय से पहले इसे त्यागना नहीं चाहता था, हालांकि, मैं एक सहयोगी के साथ इस पर गया था। हमने यह पुष्टि करते हुए समाप्त कर दिया कि यह पकड़ में नहीं आता है, लेकिन अब एक और संभावित समाधान पोस्ट किया है, और जॉन ने इसे शामिल करने के लिए अपना पोस्ट संपादित किया। इस पल के रूप में, मैं उनमें से किसी को भी सही ढंग से काम करने की पुष्टि नहीं कर सकता, और मैं अभी भी प्रयास कर रहा हूं। मैंने अपना कोड पोस्ट किया है यह देखने के लिए कि क्या यह मदद करता है। क्या मैंने गलत किया?
फ्रेंकस्टीन

@ फ्रेंकस्टीन, इस रूप में यह अत्यधिक भ्रामक है। मैं कहूंगा कि यह उदाहरण एक उत्कृष्ट उदाहरण है कि आप मैथ्स की पाठ्य पुस्तक पढ़ने की उम्मीद करेंगे , लेकिन यह सामान्य गेम प्रोग्रामिंग के संबंध में बहुत ही भ्रामक है। एकमात्र महत्वपूर्ण तत्व कोण है (जो मूल उत्तर जॉन हैमिल्टन ने पोस्ट किया था) प्रदान करता है। मैं तुम क्या मतलब है विशेष कोण से, अंत में आप देख सकते हैं इस गलत तरीके से किया है। मुझे लगता है कि इस जवाब में, गलत तरीके से करने के लिए बहुत जगह है
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.