. . . . . .เอาละทีนี้เราจะมาลุยต่อไปว่าทำยังงัยให้จุด X, Y และ Z ในระบบสามมิติมาเป็น X, Y ในระบบสองมิติ ซึ่งมันก็ไม่ได้คำนวณอะไรยากมากมายเลย ดูรูปครับ |
. . . . . .จากรูปในระบบแกนสองมิติ มีแกน X และแกน Y จะเห็นจุดสีเขียวๆ นั่นคือจุดที่เราคำนวณมาจากค่า X, Y และ Z จากรูปค่า X มีค่า 10 และค่า Y มีค่า10 ค่า X ในระบบสามมิติก็ต้องเป็น 10.0, Y มีค่า 10.0 และ Z = 1.0 ครับ ทำไมเหรอ ลองดูสูตรการคำนวณค่า XYZ ในระบบสามมิติเป็นค่า XY ในระบบสองมิตินะครับ |
x = x3d / z3d; y = y3d / z3d; |
. . . . . .บางคนเห็น เฮ้ย !!! ง่ายขนาดนี้เหรอ ก็แค่นี้ละครับสูตร ลองแทนค่าดูสิครับ ทีนี้แกน X และแกน Y ในหน้าจอของเรา ได้มาจากไหน หึหึหึ....ดูรูปครับ |
. . . . . .จากรูปข้างบนแกน X และแกน Y ในระบบสองมิติได้มากจากความยาวและความกว้างของหน้าจอครับ สมมติว่าหน้าจอมีขนาด 640x480 เราก็แบ่งความยาวครึ่งนึง ความกว้างครึ่งนึง เพื่อให้ได้จุดกลางของหน้าจองัยละ เพราะแกนในระบบสองมิติแกนทั้งสองจะมีค่าลบและบวกคือ -X, +X, -Y, +Y และจุดเริ่มต้นคือ X=0, Y=0 ตอนนี้เราก็ได้จุดเริ่มต้นแล้วครับ ไม่น่าจะงงนะ ??? ทีนี้จากสูตรคำนวณสามมิติมาเป็นสองมิติ เราก็ต้องนำจุดกลางจอนี้มาใช้ในการคำนวณด้วยครับ ดูสูตรข้างล่าง |
x = (x3d / z3d) + CenterX; y = CenterY - (y3d / z3d); |
. . . . . .บางคนสงสัยทำไมค่า Y ต้องได้จากการลบจุดกลางแนวตั้ง ก็แกน +Y มันตั้งขึ้นนี่นา...เราก็ต้องลบสิครับ ถ้าเราบวกมันก็จะตกลงมาข้างล่างเป็นแกน -Y ครับ ลองใช้สูตรที่บอกมานี้คำนวณเล่นๆ ไปก่อนนะครับ แต่ในการใช้งานจริง เราต้องมีอีกค่านึงครับ เราเรียกว่าค่า FocalDistance ครับ ซึ่งมีค่าเท่ากับ 256.0 จะลองเปลี่ยนค่าดูก็ได้นะครับ แต่เวลาคำนวณแล้วมันจะไม่ตรงความจริงเท่าไรครับ อ้อ !!! ขอบอกไว้ก่อนว่าค่านี้สำคัญมาก ไม่มีไม่ได้ครับ |
x = ((x3d / z3d) * 256.0) + CenterX; y = CenterY - ((y3d / z3d) * 256.0); |
. . . . . .ค่า FocalDistance นี้จะมีผลในกรณีที่เราหมุนแกน X, Y หรือ Z ซึ่งได้จากค่า Sin และ Cos มาคำนวณในระบบ matrix อีกทีนึง ค่า FocalDistance 256.0 เป็นค่าที่ผมคิดว่าเหมาะสมและใกล้เคียงกับความจริงแล้วครับ |