-1

我一直在尝试解决最后一天左右的错误,但似乎无法解决。这种错误可能很容易修复:S 我试图搜索类似的问题,但修复不适用。

主程序

int main(int argc, char *argv[]){
    int width, height;
    std::vector<Obj*> world;

    world.push_back(new Sphere(Vec(0, 0, -22), 2, Vec(0.2, 0.2, 0.2), true));

    (...)

    return 0;
}

当我尝试创建球体时发现错误。

相关类 Obj.h

class Obj
{
public:
    Vec color;
    bool culling;

    virtual bool intersect(const Vec &ray_orig, Vec &ray_dir, float *t0 = NULL, float *t1 = NULL) = 0;
};

球体.h

class Sphere: public Obj
{
public:
    Vec center;                         
    float radius, radius2;                

    Sphere(Vec center, float radius, Vec color, bool culling);

    bool intersect(const Vec &ray_orig, Vec &ray_dir, float *t0 = NULL, float *t1 = NULL);
};

球体.c

Sphere::Sphere(Vec center, float radius, Vec color, bool culling){
    this->center = center;
    this->radius = radius;
    this->color = color;
    this->culling = culling;
}


bool Sphere::intersect(const Vec &ray_orig, Vec &ray_dir, float *t0 = NULL, float *t1 = NULL) {...}

当我这样做时出现第二个错误- >color = color; . 不确定它们是否相关。

Vec是一个具有 3 个变量的简单结构。

如果您需要更多信息,我会尽快添加。

先感谢您。

何塞

编辑

抱歉耽搁了。

intersect(...)是 obj 类中的唯一函数。因为有几个对象(球体,盒子,......),所以无论如何都要保持抽象。

按照这里的要求,vec.h 的定义

vec.h

    struct Vec {

        float x, y, z;

        Vec() {x = 0, y = 0, z = 0;}
        Vec(float val) {x = val, y = val, z = val;}
        Vec(float x_val,float y_val,float z_val) {x = x_val, y = y_val, z = z_val;}
        Vec(const Vec& copy) : x(copy.x), y(copy.y), z(copy.z) { }

        Vec operator+ (const Vec& p) const {
            return Vec(x + p.x, y + p.y, z + p.z);
        }

        Vec operator- (const Vec& p) const {
            return Vec(x - p.x, y - p.y, z - p.z);
        }

        Vec& operator += (const Vec& p) {
            x += p.x; y += p.y; z += p.z;
            return *this;
        }

        Vec& operator -= (const Vec& p) {
            x -= p.x; y -= p.y; z -= p.z;
            return *this;
        }

        Vec operator* (const float f) const {
            return Vec(f * x, f * y, f * z);
        }

        Vec& operator*= (const float f) {
            x *= f; y *= f; z *= f;
            return *this;
        }

        Vec operator/ (const float f) const {
            float inv = 1.f / f;
            return Vec(inv * x, inv * y, inv * z);
        }

        Vec& operator/= (const float f) {
            float inv = 1.f / f;
            x *= inv; y *= inv; z *= inv;
            return *this;
        }

Vec& operator= (const Vec& p) {
        x = p.x; y = p.y; z = p.z;
        return *this;
    }

    bool operator== (const Vec& p) {
        if(x == p.x && y == p.y && z == p.z)
            return true;
        return false;
    }

        float length_squared() const {
            return x*x + y*y + z*z;
        }

        float length() const {
            return sqrt(length_squared());
        }

        Vec norm() const {
            float nor = x * x + y * y + z * z;
            if (nor > 0) {
                float invNor = 1 / sqrt(nor);
                (float)x *= invNor, (float)y *= invNor, (float)z *= invNor;
            }
            return *this;
        }

        Vec cross(const Vec&b) {
            return Vec(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);
        }

        float dot(const Vec& v) {
            return x * v.x + y * v.y + z * v.z;
        }


    };
4

1 回答 1

0

看来问题确实出在 vec 文件中。

找不到有关修复的原因,但是将 Vec 结构更改为一个类可以解决所有问题。

谢谢您的帮助。

于 2013-05-04T11:03:14.017 回答