كيف يمكنني استخدام رسم خرائط النسيج في أداة تتبع شعاع بسيطة؟

StackOverflow https://stackoverflow.com/questions/2649674

  •  27-09-2019
  •  | 
  •  

سؤال

أحاول إضافة ميزات إلى أداة تتبع الأشعة في لغة C++.وهي أنني أحاول إضافة تعيين نسيج إلى المجالات.للتبسيط، أستخدم مصفوفة لتخزين بيانات النسيج.لقد حصلت على بيانات النسيج باستخدام محرر سداسي عشري ونسخ قيم البايت الصحيحة إلى مصفوفة في الكود الخاص بي.وكان هذا فقط لأغراض الاختبار الخاصة بي.عندما تتوافق قيم هذه المصفوفة مع صورة باللون الأحمر فقط، يبدو أنها تعمل بالقرب من ما هو متوقع باستثناء عدم وجود تظليل.الصورة الأولى http://dl.dropbox.com/u/367232/Texture.jpgيُظهر الجزء السفلي الأيمن من الصورة الشكل الذي يجب أن تبدو عليه الكرة الصحيحة.لون هذه الكرة باستخدام مجموعة ألوان واحدة، وليس خريطة نسيج.

هناك مشكلة أخرى وهي أنه عندما تكون خريطة النسيج مكونة من شيء آخر غير بكسل لون واحد فقط، فإنها تتحول إلى اللون الأبيض.الصورة الاختبارية الخاصة بي هي صورة للمياه، وعندما يتم رسمها، فإنها تظهر حلقة واحدة فقط من وحدات البكسل المزرقة المحيطة باللون الأبيض.

bmp http://dl.dropbox.com/u/367232/vPoolWater.bmp

عندما يتم ذلك، يظهر ببساطة كما يلي:الصورة الثانية http://dl.dropbox.com/u/367232/texture2.jpg

فيما يلي بعض مقتطفات التعليمات البرمجية:

  Color getColor(const Object *object,const Ray *ray, float *t)
  {
   if (object->materialType == TEXTDIF || object->materialType == TEXTMATTE) {
    float distance = *t;
    Point pnt = ray->origin + ray->direction * distance;
    Point oc = object->center; 
    Vector ve = Point(oc.x,oc.y,oc.z+1) - oc;
    Normalize(&ve);
    Vector vn = Point(oc.x,oc.y+1,oc.z) - oc;
    Normalize(&vn);
    Vector vp = pnt - oc;
    Normalize(&vp);

    double phi = acos(-vn.dot(vp));

    float v = phi / M_PI;
    float u;

    float num1 = (float)acos(vp.dot(ve));
    float num = (num1 /(float) sin(phi));

    float theta = num /(float) (2 * M_PI);
    if (theta < 0 || theta == NAN) {theta = 0;}
    if (vn.cross(ve).dot(vp) > 0) {
        u = theta;
    }
    else {
        u = 1 - theta;
    }
    int x = (u * IMAGE_WIDTH) -1;
    int y = (v * IMAGE_WIDTH) -1;
    int p = (y * IMAGE_WIDTH + x)*3;

    return Color(TEXT_DATA[p+2],TEXT_DATA[p+1],TEXT_DATA[p]);

}
else {
    return object->color;
}
};

أقوم باستدعاء رمز اللون هنا في Trace:

if (object->materialType == MATTE)
    return getColor(object, ray, &t);

Ray shadowRay;
int isInShadow = 0;
shadowRay.origin.x = pHit.x + nHit.x * bias;
shadowRay.origin.y = pHit.y + nHit.y * bias;
shadowRay.origin.z = pHit.z + nHit.z * bias;
shadowRay.direction = light->object->center - pHit;
float len = shadowRay.direction.length();
Normalize(&shadowRay.direction);
float LdotN = shadowRay.direction.dot(nHit);
if (LdotN < 0)
    return 0;
Color lightColor = light->object->color;
for (int k = 0; k < numObjects; k++) {
    if (Intersect(objects[k], &shadowRay, &t) && !objects[k]->isLight) {
        if (objects[k]->materialType == GLASS)
            lightColor *= getColor(objects[k], &shadowRay, &t); // attenuate light color by glass color
        else
            isInShadow = 1;
        break;
    }
}
lightColor *= 1.f/(len*len);
return (isInShadow) ? 0 : getColor(object, &shadowRay, &t) * lightColor * LdotN;
}

لقد تركت بقية الكود حتى لا أعرقل المنشور، ولكن يمكن رؤيته هنا.أي مساعدة يحظى بتقدير كبير.الجزء الوحيد الذي لم يتم تضمينه في الكود، هو المكان الذي أقوم فيه بتحديد بيانات النسيج، والتي كما قلت، مأخوذة ببساطة مباشرة من ملف صورة نقطية للصورة أعلاه.

شكرًا.

هل كانت مفيدة؟

المحلول

من الممكن أن يكون النسيج قد تم غسله لأن الضوء ساطع جدًا وقريب جدًا.لاحظ أنه في الحالة الحمراء الصلبة، لا يبدو أن هناك أي تدرج حول الكرة.يبدو اللون الأحمر وكأنه مشبع.

يبدو تعيين u,v الخاص بك صحيحًا، ولكن قد يكون هناك خطأ هناك.وأود أن أضيف بعض assert عبارات للتأكد من أن u و v وبين 0 و 1 وأن ​​مؤشر p موجود في ملفك TEXT_DATA المصفوفة موجودة أيضًا ضمن النطاق.

نصائح أخرى

إذا كنت تقوم بتصحيح القوام الخاص بك ، فيجب عليك استخدام مادة ثابتة يتم تحديد لونها فقط بواسطة الملمس وليس الأضواء. وبهذه الطريقة ، يمكنك التأكد من أنك تقوم بتخطيط نسيجك بشكل صحيح وتصفيةه بشكل صحيح قبل القيام بأي إضاءة عليه. ثم تعلم أن هذا الجزء ليس هو المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top