ট্যানজেন্ট এবং বিটজেন্ট ভেক্টরগুলি কীভাবে গণনা করা যায়


9

আমার একটি টেক্সচার থ্রি জেজে লোড হয়েছে, তারপরে শেডারে পৌঁছেছে। ভার্টেক্স শ্যাডারে আমি সাধারণটি গণনা করি এবং আমি একটি ভেরিয়েবল uv ভেক্টরে সংরক্ষণ করি।

<script id="vertexShader" type="x-shader/x-vertex">

                varying vec3 N,P;
                varying vec2 UV;

                void main() {
                    gl_Position= projectionMatrix * modelViewMatrix * vec4(position,1.0);
                    P= position;
                    N= normalMatrix * vec3(normal);
                    UV= uv;
                }
            </script>
            <script id="fragmentShader" type="x-shader/x-fragment">

                varying vec3 N,P;
                varying vec2 UV;
                uniform sampler2D texture;

                void main() {
                    gl_FragColor= texture2D(texture,UV);
                }

            </script>

আমি কীভাবে টি এবং বি ভেক্টরগুলি গণনা করব?


2
আপনি কি সাধারণভাবে বা বিশেষত আপনার পছন্দের লাইব্রেরির জন্য অ্যালগরিদম চান?
ধারণা 3d

আমি যদি এটিকে তিন.জেএস এর সাথে গুণতে পারি তবে এটি আরও ভাল।
রমি আল জুহৌরি

উত্তর:


26

প্রথমত, প্রতিটি 3 ডি ভার্টেক্সের জন্য রয়েছে অসীম ট্যানজেন্ট এবং দ্বি-স্পর্শী ভেক্টর। নীচের চিত্রটি ব্যাখ্যা করে যে কেন প্রতিটি ভার্টেক্সের জন্য সীমাহীন সংখ্যক স্পর্শক স্পেস রয়েছে, ট্যানজেন্ট এবং বিটানজেন্টের দেখানো বিমানটিতে কোনও দিক থাকতে পারে।

প্রতিটি শিরোনামের জন্য অসীম সংখ্যার স্পর্শ স্থান

সুতরাং সঠিকভাবে সর্বাধিক দরকারী 1 স্পর্শক স্থান গণনা করার জন্য, আমরা চাই আমাদের স্পর্শকাতর স্থানটি এমনভাবে সংযুক্ত করা হোক যাতে এক্স অক্ষ (স্পর্শক )টি দ্বিশত মানচিত্রে আপনার দিকের সাথে মিল থাকে এবং y অক্ষ (বিটজেন্ট) v দিকের সাথে সামঞ্জস্য করে গলির মানচিত্রে, আমাদের ইতিমধ্যে ভার্টেক্সের স্বাভাবিক হওয়া উচিত যা ইতিমধ্যে স্পর্শকাতর জেড দিকের সাথে সামঞ্জস্য করে।

(1) সর্বাধিক দরকারী কারণ শেষ পর্যন্ত আমরা চাই চাই যে সাধারণ ভেক্টরগুলি টেক্সচার থেকে নমুনা দেওয়া হোক

ছবিগুলির সাথে এটি সর্বোত্তমভাবে ব্যাখ্যা করা উচিত, আমরা চাই আমাদের স্পর্শকাতর স্থানটি(u, v) নীচের মতো দেখানো মতো সারিবদ্ধ হোক ।

এখানে চিত্র বর্ণনা লিখুন

চিত্রের উত্স যদিও কম্পিউটারের গ্রাফিক্সের সাথে কঠোরভাবে সম্পর্কিত নয়

কম্পিউটার গ্রাফিক্সে বিকাশকারীরা সাধারণত (u,v)টেক্সচার সমন্বয় হিসাবেও পরিচিত known আমরা ধরে নেব যে টি হ'ল স্পর্শক এবং বি হ'ল বিটজেন্ট এবং P0এটি আমাদের টার্গেট ভারটেক্স, এটি ত্রিভুজের একটি অংশ (P0,P1,P2)

প্রথমে মনে রাখতে হবে আমরা যা করতে চেয়েছিলাম তা হল স্পর্শক এবং বিটেজেট গণনা করা:

  1. টি আপনার সাথে এবং বি এর সাথে একত্রিত হয়েছে।
  2. টি এবং বি বিমানটি ভার্টেক্স সাধারণ (উপরের চিত্রে প্রদর্শিত প্লেন) দিয়ে বিছানায় থাকে।

মুল বক্তব্যটি আমরা ইতিমধ্যে ধরে নিয়েছি যে টি এবং বি একই বিমানে অবস্থান করে এবং এখন ইউ এবং ভি এর সাথে মিল রাখে যদি আমরা তাদের মানগুলি জানতে পারি আমরা পণ্যটি এবং তৃতীয় ভেক্টরকে পৃথিবী থেকে ট্যানজেন্ট স্পেসে রূপান্তর ম্যাট্রিক্স নির্মাণ করতে পারি।

এখানে চিত্র বর্ণনা লিখুন

প্রদত্ত যে আমরা জানি যে কোনও 2 ডি ভেক্টর দুটি স্বতন্ত্র ভেক্টর 2 এর রৈখিক সংমিশ্রণ হিসাবে রচনা করা যেতে পারে এবং যেহেতু আমাদের উপরের চিত্রটিতে প্রদর্শিত ত্রিভুজ পয়েন্ট (প্রান্ত) ইতিমধ্যে রয়েছে। আমরা লিখতে পারি:

E1 = (u1-u0) টি + (v1-v0) বি

E2 = (u2-u0) টি + (v2-v0) বি

(২) আসলে এভাবেই ভিত্তি ম্যাট্রিক্স উত্পন্ন হয়

উপরের সমীকরণটি ম্যাট্রিক্স আকারে লেখা যেতে পারে,

| E1x E1y E1z |   | deltaU1 deltaV1 | * | Tx Ty Tz |
| E2x E2y E2z | = | deltaU2 deltaV2 |   | Bx By Bz |

ম্যাট্রিক্স সমীকরণ সমাধান করে আমরা টি এবং বি মান নির্ধারণ করতে পারি আমরা একটি রূপান্তর ম্যাট্রিক্স তৈরি করতে পারি।

সি ++ তে সম্পূর্ণ উত্স কোড

#include "Vector4D.h"


struct Triangle
{
    unsigned short  index[3];
};


void CalculateTangentArray(long vertexCount, const Point3D *vertex, const Vector3D *normal,
        const Point2D *texcoord, long triangleCount, const Triangle *triangle, Vector4D *tangent)
{
    Vector3D *tan1 = new Vector3D[vertexCount * 2];
    Vector3D *tan2 = tan1 + vertexCount;
    ZeroMemory(tan1, vertexCount * sizeof(Vector3D) * 2);

    for (long a = 0; a < triangleCount; a++)
    {
        long i1 = triangle->index[0];
        long i2 = triangle->index[1];
        long i3 = triangle->index[2];

        const Point3D& v1 = vertex[i1];
        const Point3D& v2 = vertex[i2];
        const Point3D& v3 = vertex[i3];

        const Point2D& w1 = texcoord[i1];
        const Point2D& w2 = texcoord[i2];
        const Point2D& w3 = texcoord[i3];

        float x1 = v2.x - v1.x;
        float x2 = v3.x - v1.x;
        float y1 = v2.y - v1.y;
        float y2 = v3.y - v1.y;
        float z1 = v2.z - v1.z;
        float z2 = v3.z - v1.z;

        float s1 = w2.x - w1.x;
        float s2 = w3.x - w1.x;
        float t1 = w2.y - w1.y;
        float t2 = w3.y - w1.y;

        float r = 1.0F / (s1 * t2 - s2 * t1);
        Vector3D sdir((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
                (t2 * z1 - t1 * z2) * r);
        Vector3D tdir((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,
                (s1 * z2 - s2 * z1) * r);

        tan1[i1] += sdir;
        tan1[i2] += sdir;
        tan1[i3] += sdir;

        tan2[i1] += tdir;
        tan2[i2] += tdir;
        tan2[i3] += tdir;

        triangle++;
    }

    for (long a = 0; a < vertexCount; a++)
    {
        const Vector3D& n = normal[a];
        const Vector3D& t = tan1[a];

        // Gram-Schmidt orthogonalize
        tangent[a] = (t - n * Dot(n, t)).Normalize();

        // Calculate handedness
        tangent[a].w = (Dot(Cross(n, t), tan2[a]) < 0.0F) ? -1.0F : 1.0F;
    }

    delete[] tan1;
}

সম্পূর্ণ উত্স কোড এবং ডেরাইভেশন এখানে পাওয়া যাবে


আমার যদি ত্রিভুজ না থাকে? আমার ক্ষেত্রে আমার একটি টেক্সচার রয়েছে যা একটি গোলকের উপর প্রয়োগ করা উচিত। এই ক্ষেত্রে এটি কীভাবে মানিয়ে নেবেন?
রামি আল জুহৌরি

পছন্দ করুন আপনি ঠিক কোডের মতো শীর্ষে লুপ করেছেন। যদি আপনার গোলকটি ত্রিভুজ ভিত্তিক না হয় তবে এটি সম্পূর্ণ আলাদা গল্প।
ধারণাগুলি

আমি থ্রি। জেএস স্পিরিওমিট্রি (জাভাস্ক্রিপ্টে) ব্যবহার করছি। আমার মুখের সম্পত্তি ছায়ায় ছড়িয়ে দেওয়া উচিত? আমি যে গোলকের অঙ্কন করেছি তাতে 1089 টি শীর্ষ এবং 1084 টি মুখ রয়েছে has
রামি আল জুহৌরি

1
আপনি স্পর্শকাতর স্থান গণনা করুন এবং তারপরে ছায়ায় ছুঁতে ছুঁতে পারেন। স্পর্শকাতর স্থানটি গণনা করার জন্য আপনার মুখ / প্রান্তগুলিতে অ্যাক্সেস থাকা উচিত।
ধারণাগুলি

আমার ক্ষেত্রে আমার 1084 টাঞ্জেন্ট থাকবে, আমি কীভাবে শীর্ষে দিয়ে স্পর্শগুলি ম্যাপ করব?
রামি আল জুহুরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.