首页 > 其他分享 >0204-可移动相机

0204-可移动相机

时间:2024-07-22 09:31:46浏览次数:18  
标签:origin Point3 self Vector3 相机 0204 other let 移动

环境

  • Time 2022-11-17
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html

目标

将相机的位置和远近参数化,可以调节相机的位置。

叉乘

// 向量的叉乘
pub fn cross(self, other: Vector3) -> Vector3 {
    Vector3 {
        x: self.y * other.z - self.z * other.y,
        y: self.z * other.x - self.x * other.z,
        z: self.x * other.y - self.y * other.x,
    }
}

camera.rs

use super::ray::Ray;
use super::vector3::{Point3, Vector3};

pub struct Camera {
    origin: Point3,
    corner: Point3,
    horizontal: Vector3,
    vertical: Vector3,
}

pub const RATIO: f64 = 16.0 / 9.0;

impl Camera {
    pub fn new(origin: Point3, at: Point3, vup: Vector3, fov: f64, ratio: f64) -> Camera {
        let theta = std::f64::consts::PI / 180.0 * fov;
        let viewport_height = 2.0 * (theta / 2.0).tan();
        let viewport_width = ratio * viewport_height;

        let cw = (origin - at).unit();
        let cu = vup.cross(cw);
        let cv = cw.cross(cu);

        let horizontal = viewport_width * cu;
        let vertical = viewport_height * cv;

        let corner = origin - horizontal / 2.0 - vertical / 2.0 - cw;

        Camera {
            origin,
            horizontal,
            vertical,
            corner,
        }
    }

    pub fn get_ray(&self, u: f64, v: f64) -> Ray {
        let vector3 = self.corner + u * self.horizontal + v * self.vertical;

        Ray {
            origin: self.origin,
            direction: vector3 - self.origin,
        }
    }
}

Camera

// 相机
let camera = Camera::new(
    Point3::new(-2.0, 2.0, 1.0),
    Point3::new(0.0, 0.0, -1.0),
    Vector3::new(0.0, 1.0, 0.0),
    // 20.0,
    90.0,
    camera::RATIO,
);

效果

距离 90:
90

距离 20:
20

总结

将相机参数,可以改变相机的位置等。

附录

标签:origin,Point3,self,Vector3,相机,0204,other,let,移动
From: https://www.cnblogs.com/jiangbo4444/p/18315387

相关文章

  • 移动硬盘在苹果电脑上使用后在windows中无法读取 Win和Mac的硬盘怎么通用
    在日益普及的跨平台工作环境中,苹果电脑与WindowsPC之间的数据交换成为日常需求。然而,用户常面临一个困扰:为何苹果电脑的硬盘能在macOS下流畅运行,却在Windows系统中变得“水土不服”?这一问题核心在于硬盘格式的不兼容性,尤其是苹果采用的HFS+与Windows主流的NTFS之间的屏障。一......
  • 移动流量包怎么买划算?中国移动领流量活动推荐
    活动一:移动云盘新人大礼包10G3天包https://www.201800.com/gdyd/活动二:上传文件领10G流量新老用户享注意这个活动容易误导人,明明已经上传文件了,还是提示上传文件,这种情况可以忽略上传提示,直接点击领取即可。活动三:2GB日包新老用户专享活动四:云盘粉丝10G流量包限量活动......
  • android audio 相机按键音加载与修改
    相机按键音资源,加载文件路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp按键音,加载函数: voidCameraService::loadSoundLocked(sound_kindkind){   ATRACE_CALL();     LOG1("CameraService::loadSoundLockedref=%d",mSoundRe......
  • Leetcoede编程基础0到1——459.重复的子字符串 & 283.移动零 &1822.数组元素积的符号
    459.重复的子字符串给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。示例1:输入:s="abab"输出:true解释:可由子串"ab"重复两次构成。示例2:输入:s="aba"输出:false示例3:输入:s="abcabcabcabc"输出:true解释:可由子......
  • 将 pandas 数据框中的列移动到大型数据框中的最后一列的最佳方法
    我有一个包含100多列的pandas数据框。例如,在以下df:df['A','B','C','D','E','date','G','H','F','I']如何将日期移动到最后一列?假设数据帧很大并且我无法手动写入所有列名称。以下是将pandas数据框中的列移动到大型数据框......
  • 3.1、matlab双目相机标定实验
    1、双目相机标定原理及流程双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等),以便将双目相机捕获的图像转换为三维空间坐标。双目相机标定的......
  • 2850. 将石头分散到网格图的最少移动次数 Medium
    给你一个大小为 3*3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头,一个格子里可能会有 多个 石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰......
  • JavaScript - jSignature移动端手写签名
    <html><head><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jSignature/2.1.3/jSignature.min.js"></script>......
  • 键鼠助手--FPS游戏移动优化算法
    目前FPS类游戏的宏检测机制比较严格,因此我们对此类游戏做了特殊优化图示中的参数意义如下:在180毫秒内移动[4,10]的距离(屏幕左上角是原点,向右向下移动为正,向左向上移动为负);然后总计拆分为[80/2480/11]次也就是[47]次;以后宏运行的时候随机取4到7次进行移动,移动总距离是[4,10......
  • JavaScript实现通过按纽控制电梯上下移动,并实现帧频动画
    varapp=newPIXI.Application(520,460);document.body.appendChild(app.view);//创建背景varbg=newPIXI.Sprite.fromImage("res/lianxi/elevator/bg.png");app.stage.addChild(bg);varelevator=newPIXI.Sprite.fromImage("res/lianxi/elevator/dt......