真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

從零開(kāi)始使用C++編寫Ray-Tracer-創(chuàng)新互聯(lián)

光線追蹤是一種基于光傳播模擬的3D渲染技術(shù)。該技術(shù)能夠產(chǎn)生非常高的視覺(jué)真實(shí)感。

無(wú)棣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

原理很簡(jiǎn)單。它包括滑動(dòng)每個(gè)像素的屏幕像素。對(duì)于每個(gè)像素,請(qǐng)查看從相機(jī)經(jīng)過(guò)該像素的光線是否會(huì)與場(chǎng)景中的任何對(duì)象相交。像素采用對(duì)象的顏色。如果不相交,則像素采用背景色。實(shí)際上,像素并不會(huì)照原樣呈現(xiàn)對(duì)象顏色,而是通過(guò)稱為著色的過(guò)程計(jì)算出的顏色。著色的目的是使渲染更加真實(shí)感。
攝像機(jī)的位置以及場(chǎng)景中的所有物體均由3d向量表示,顏色也由3d向量表示。因此,我們需要一直操縱向量。

#ifndef Vect_h
#define Vect_h

#include 

using namespace std;

class Vec3 {
public:
    float X;
    float Y;
    float Z;
    Vec3(float x, float y, float z) : X(x), Y(y), Z(z) {}
    Vec3 operator +(Vec3 vec) {
        return Vec3(X+vec.X,Y+vec.Y,Z+vec.Z);
    }
    Vec3 operator -(Vec3 vec) {
        return Vec3(X-vec.X,Y-vec.Y,Z-vec.Z);
    }
    Vec3 operator *(float scalar) {
        return Vec3(scalar*X,scalar*Y,scalar*Z);
    }
    float dot(Vec3 vec) {
        return X*vec.X+Y*vec.Y+Z*vec.Z;
    }
    float norm() {
        return sqrt(dot(*this));
    }
    Vec3 normalize() {
        return (*this)*(1/norm());
    }

};

#endif

射線與球體的交點(diǎn):
從零開(kāi)始使用C ++編寫Ray-Tracer
以c為中心,半徑為r的球面的方程為:
從零開(kāi)始使用C ++編寫Ray-Tracer
射線(一條線)的方程為:
從零開(kāi)始使用C ++編寫Ray-Tracer
其中o代表射線的原點(diǎn),d代表射線的方向,t是參數(shù)。
那么對(duì)于相交點(diǎn),t必須滿足:
從零開(kāi)始使用C ++編寫Ray-Tracer
注意:
從零開(kāi)始使用C ++編寫Ray-Tracer
然后 :
從零開(kāi)始使用C ++編寫Ray-Tracer
這是二次方程。通過(guò)添加單位向量d,我們可以:
從零開(kāi)始使用C ++編寫Ray-Tracer
解(如果有)是:
從零開(kāi)始使用C ++編寫Ray-Tracer

    bool Sphere::intersect(Ray& ray, float &t) {
        Vec3 o = ray.get_origin();
        Vec3 d = ray.get_direction();

        Vec3 v = o - Center;

        const float b = 2 * v.dot(d);
        const float c = v.dot(v) - Radius*Radius;
        float delta = b*b - 4 * c;

        if (delta < 1e-4)
            return false;

        const float t1 = (-b - sqrt(delta))/2;
        const float t2 = (-b + sqrt(delta))/2;

        t = (t1 < t2) ? t1 : t2; // get the first intersection only

        return true;
    }

著色:
在開(kāi)始之前,讓我們介紹一些符號(hào)。
從零開(kāi)始使用C ++編寫Ray-Tracer
從要著色點(diǎn)到攝像機(jī)的單位向量V。
在所考慮點(diǎn)垂直于球體的法向量N。
易得給定球面一點(diǎn)的法向量:


    Vec3 Sphere::get_normal(Vec3 p) {
        return (p - Center) * (-1/(Radius));
    }

因?yàn)椋涸诳紤]的點(diǎn)p上的每個(gè)法向矢量必須與將p連接到球體中心的半徑共線。
簡(jiǎn)單著色工作很好(正面比,此著色器將返回著色法線和入射光線方向的點(diǎn)積的絕對(duì)值,在其他渲染器中,也稱為入射。):
facing ratio = V . N
它是V和N之間的夾角的余弦。我們可以使用它來(lái)對(duì)球體進(jìn)行如下著色:

Vec3 Shading(Ray ray, Sphere sphere) { 
  Vec3 color(0, 0, 0);
  float t;
  if (sphere.intersect(ray, t)) {
    Vec3 V = ray.get_direction();
    Vec3 P = ray.get_origin() +  V * t;
    Vec3 N = sphere.get_normal(P);

    float facing_ratio = N.dot(V);

    color = sphere.get_color() * (facing_ratio * 0.5);
  }
  return color;
}

結(jié)果如下:
從零開(kāi)始使用C ++編寫Ray-Tracer

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


分享名稱:從零開(kāi)始使用C++編寫Ray-Tracer-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/desjee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部