问题标题: 关于C++渲染3D的思考

0
0
已解决
王牌工作室官方
王牌工作室官方
新手光能
新手光能

使用C++编写3D游戏,是无数问答人都在为之努力的梦想

真3D后面说,我学会了一种伪3D:3D Raycaster

本质上就是向玩家(点)周围做射线,获取射线与数个墙壁(数个线段)的最近一个交点,近大远小,距离玩家距离近的就渲染大一点,距离玩家远的就渲染矮一点

阅读下面代码

#include <iostream>
#include <cmath>

struct Point {
    double x, y;
};

// 计算两点之间的距离
double distance(const Point& a, const Point& b) {
    return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));
}

// 计算点积
double dot(const Point& a, const Point& b) {
    return a.x * b.x + a.y * b.y;
}

// 计算叉积
double cross(const Point& a, const Point& b) {
    return a.x * b.y - a.y * b.x;
}

// 计算交点
bool getIntersection(const Point& P, double theta, const Point& A, const Point& B, Point& intersection) {
    Point direction = {cos(theta), sin(theta)};
    double dx = B.x - A.x;
    double dy = B.y - A.y;

    // 计算直线AB的参数方程
    double t = (cross(P, A) * dx - cross(A, B) * dx) / (cross(direction, A - B));
    double s = (cross(P, A) * dy - cross(A, B) * dy) / (cross(direction, A - B));

    if (t < 0 || t > 1 || s < 0 || s > 1) {
        return false; // 交点不在AB线段上
    }

    intersection.x = P.x + t * direction.x;
    intersection.y = P.y + t * direction.y;
    return true;
}

int main() {
    Point P = {0, 0}; // 起点
    double theta = M_PI / 4; // 射线角度,以弧度为单位
    Point A = {1, 1};
    Point B = {4, 4};
    Point intersection;

    if (getIntersection(P, theta, A, B, intersection)) {
        std::cout << "交点坐标: (" << intersection.x << ", " << intersection.y << ")" << std::endl;
    } else {
        std::cout << "没有交点" << std::endl;
    }

    return 0;
}

你发现了什么,我们可以获取交点坐标,有了交点坐标,有了玩家坐标,可以计算距离和角度,进而获得渲染墙壁的高度与位置

向玩家周围发射射线,每条射线都这么判断,因为是直接使用数学函数计算,所以不存在性能问题,可以简单的看做O(1)

后面内容我还在思考,等我做出3D Raycaster程序后再发出来


0
已采纳
薛乘志
薛乘志
初级启示者
初级启示者

本质上就是向量运算嘛,学过的都能想出个乞丐版

这种思路主要是太慢,渲染直线还好,渲染什么实心立体图形的话复杂度高的吓人

(不如直接调opengl)

0
吴子轩
吴子轩
高级守护
高级守护

这   

问题是你可以算出位置,

但c++做不成3D的效果

 

0
吴子轩
吴子轩
高级守护
高级守护

我想到一种方法,就是用平面表示立体

比如

类似于素描

0
薛乘志
薛乘志
初级启示者
初级启示者

但是你这代码我没看懂,二维向量为什么有外积

0
崔安昊
崔安昊
中级光能
中级光能

我之前试过3D建模,用的是Epic的虚幻引擎,但是后来因为一系列原因,导致我没有成功,删除引擎之后,电脑里连带了好多软件都不见饿了

我要回答