我正在尝试获取3D空间中某个点的2D屏幕坐标,即我知道相机的平移,倾斜和滚动的位置,并且我有一个我希望投影的点的3D x,y,z坐标.
我很难理解转换/投影矩阵,我希望这里的一些聪明人可以帮助我;)
这是我到目前为止抛出的测试代码:
public class TransformTest {
public static void main(String[] args) {
// set up a world point (Point to Project)
double[] wp = {100, 100, 1};
// set up the projection centre (Camera Location)
double[] pc = {90, 90, 1};
double roll = 0;
double tilt = 0;
double pan = 0;
// translate the point
vSub(wp, pc, wp);
// create roll matrix
double[][] rollMat = {
{1, 0, 0},
{0, Math.cos(roll), -Math.sin(roll)},
{0, Math.sin(roll), Math.cos(roll)},
}; …Run Code Online (Sandbox Code Playgroud) 我正在进行如下查询:
SELECT
*
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;
Run Code Online (Sandbox Code Playgroud)
并没有工作
我试图获取不超过3天的数据.
SQL服务器.
这该怎么做?
DATEDIFF工作太慢..
大约一个星期前,我遇到了一个问题:在自定义谷歌驱动的地图上,我的多边形不会显示,而相同坐标的标记完全没问题.尽管我使用Google Maps API,但似乎无法找到原因.
这是指向地图截图的链接.紫色箭头和数字是我的补充,他们表示:
google.maps.Marker我可以把我的"区域"的边缘.google.maps.Polygon代码生成的工件.它是预期的红色,但完全不合适并且奇怪地平坦.以下是生成标记和多边形的代码部分:
var regionData = tecMap.regions[r];
var regionMapMarkers = new google.maps.MVCArray();
for (c in regionData.coords) {
var point = projection.worldToMap(regionData.coords[c]);
debugRegionPoints.push(point);
var thisLatLng = projection.fromPointToLatLng(point);
debugRegionLatLngs.push(thisLatLng);
regionMapMarkers.push(thisLatLng);
}
regionMapMarkers.forEach(function(latLng, m){
var marker = new google.maps.Marker({
position: latLng,
map: map,
title: '',
optimized: false
});
regionCorners.push(marker);
});
var paths = new google.maps.MVCArray();
paths.push(regionMapMarkers);
var region = new google.maps.Polygon({
fillColor: "#FF0000",
fillOpacity: 0.35,
map: map,
paths: paths,
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2 …Run Code Online (Sandbox Code Playgroud) 微软声称Kinect的视角为垂直43度,水平57度(此处说明).鉴于这些,我们可以计算内在参数,即焦点和投影中心吗?我假设投影中心可以给出(0,0,0)?
谢谢
编辑:有关我正在尝试做什么的更多信息
我有一个用Kinect记录的图像数据集,我试图将像素位置(x_screen,y_screen和z_world(mm))转换为真实世界坐标.
如果我知道相机放置在真实世界坐标系中的点(x',y',z'),通过执行以下操作就足以找到真实世界的坐标:
x_world = (x_screen - c_x) * z_world / f_x
y_world = (y_screen - c_y) * z_world / f_y
Run Code Online (Sandbox Code Playgroud)
其中c_x = x'和c_y = y'和f_x, f_y是焦距?而且,只要了解视野,我怎样才能找到焦距?
谢谢
所以基本上我已经使用OpenGL创建了一个可以执行3D Ray Picking的程序.如果Camera View Direction Ray触摸/交叉任何东西(不是空气),那么将在交叉点/点处渲染一个小的紫色框.
如果光线与任何"红色框"相交,那么与光线相交的光线将变为绿色.地面和墙壁根本不会改变颜色或纹理.
例子:
我目前进行3D射线拾取的方法是获取相机的视线方向光线,然后只计算交叉点.我计算交叉点的函数不作为布尔值返回,它作为3D矢量返回(交集本身的坐标)
所以我想要实现的是计算拾取雷,但是当它没有锁定到屏幕时根据鼠标.
示例 - 所以在这里你可以看到紫色的盒子在十字准线上,但是如果我要解锁鼠标并移动它(在屏幕顶部,正常情况下)并将其移动到绿色X标记的中心我'我画了,然后我想计算从摄像机中心到屏幕顶部鼠标坐标的光线.
这应该只是一个数学问题.这里只是我目前用来计算雷的一些简短列表(并试图计算第二条射线)
鼠标X和Y原点(0x0)位于窗口/框架的左下角.
Vector3D position = new Vector3D(
camera.x,
camera.y,
camera.z);
Vector3D direction = new Vector3D(
Math.cos(Math.toRadians(camera.pitch)) * -Math.sin(Math.toRadians(-camera.yaw)) * camera.far,
Math.cos(Math.toRadians(camera.pitch)) * cameara.far,
Math.cos(Math.toRadians(camera.pitch)) * -Math.sin(Math.toRadians(-camera.yaw)) * camera.far);
direction.normalize();
Ray3D ray = new Ray(position, direction);
Run Code Online (Sandbox Code Playgroud)
这就是我计算主要拾取光线本身的方式(锁定鼠标的拾取光线).我做出了自己的类,但他们应该感(Vector3D,Ray3D,等)和normalize()方法不正是它说,标准化的载体.
因此,当我尝试使用鼠标坐标进行计算时,我在调用之前插入了以下代码direction.normalize();,因此在创建之后 …
我有一个名为 DTO 的项目PersonDetail和一个名为Person. 当我打电话
db.People.Where(p => p.FirstName == "Joe").Union(db.People.Where(p => Age > 30)).ProjectTo<PersonDetail>(mapperConfig).ToList();
Run Code Online (Sandbox Code Playgroud)
我没有得到PersonDetailDTO 和实体框架(核心)抛出异常的消息:
ArgumentException:输入序列必须具有“Test.Module.Entities.Person”类型的项目,但它具有“Test.Module.Dtos.PersonDetail”类型的项目。
当我运行代码时:
db.People.Where(p => p.FirstName == "Joe").Union(db.People.Where(p => Age > 30)).ToList();
Run Code Online (Sandbox Code Playgroud)
我Person毫无例外地得到了实体。
这是一个工作计划(有工会):
{value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person]).Where(entity => ((entity != null) And ((63ed0ebd-2c02-4496-ac8d-b836cbf13259 = = entity.CreatedBy) 或 (393a6bb0-b437-4664-beb0-6800f509451b == entity.CreatedBy)))).Union(value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person] ))}
现在这是相同的计划,但也有自动映射器投影:
{value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person]).Where(entity => ((entity != null) And ((63ed0ebd-2c02-4496-ac8d-b836cbf13259 = = entity.CreatedBy) 或 (393a6bb0-b437-4664-beb0-6800f509451b == entity.CreatedBy)))).Union(value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Test.Module.Entities.Person] )).Select(dto => new …
我一直在想我应该使用哪种投影,所以我做了一点测试,其中包括5种类型的投影(基于文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#project):
1.实体投射
这只是findAll()Spring Data存储库提供的标准.没什么好看的.
服务:
List<SampleEntity> projections = sampleRepository.findAll();
Run Code Online (Sandbox Code Playgroud)
实体:
@Entity
@Table(name = "SAMPLE_ENTITIES")
public class SampleEntity {
@Id
private Long id;
private String name;
private String city;
private Integer age;
}
Run Code Online (Sandbox Code Playgroud)
2.构造函数投影
服务:
List<NameOnlyDTO> projections = sampleRepository.findAllNameOnlyConstructorProjection();
Run Code Online (Sandbox Code Playgroud)
库:
@Query("select new path.to.dto.NameOnlyDTO(e.name) from SampleEntity e")
List<NameOnlyDTO> findAllNameOnlyConstructorProjection();
Run Code Online (Sandbox Code Playgroud)
数据传输对象:
@NoArgsConstructor
@AllArgsConstructor
public class NameOnlyDTO {
private String name;
}
Run Code Online (Sandbox Code Playgroud)
3.界面投影
服务:
List<NameOnly> projections = sampleRepository.findAllNameOnlyBy();
Run Code Online (Sandbox Code Playgroud)
库:
List<NameOnly> findAllNameOnlyBy();
Run Code Online (Sandbox Code Playgroud)
接口:
public interface NameOnly {
String getName(); …Run Code Online (Sandbox Code Playgroud) Mysql bit(1)为Java Boolean?Projection type must be an interface!当Mysqlbit(1)类型映射到Java类型时, Spring Jpa Projection出现错误Boolean。
Jpa 将实体类中的布尔列转换为 Mysql 表中的位(1)列。
如果我将getIsBasicPlanInfoProjection 接口中的类型更改Integer为Boolean,则不起作用。为什么会出现错误呢?
@Query(nativeQuery=true, value="select true as isBasic from dual")
ProductOrderDto.PlanInfoProjection findPlanInfoById(Long id);
Run Code Online (Sandbox Code Playgroud)
public class ProductOrderDto {
@Getter
public static class PlanInfo {
private Boolean isBasic;
public PlanInfo(PlanInfoProjection projection) {
// this.isBasic = projection.getIsBasic(); //<-- I want to use like this.
if (projection.getIsBasic() == …Run Code Online (Sandbox Code Playgroud) 在CQRS事件存储中,"聚合"是否包含事件的汇总视图或仅仅是对这些事件边界的引用?(组ID)
投影是事件的视图或表示,因此在聚合表示对我有意义的边界的情况下,而如果聚合包含当前的汇总状态,我会对两者之间的重复感到困惑.
如何将球面坐标(θ,φ)转换为等距矩形投影(也称为"地理投影")的位置(x,y )?
其中:
下面你会找到原来的问题,当我不能很好地理解这个问题时,我认为它仍然有助于展示这个解决方案的实际应用.
编辑:原始问题标题是:如何以给定角度转换照片成为全景照片的一部分?
如果我想以任何给定角度拍摄照片,以便我可以将得到的(扭曲/变形的)图像放置在等距矩形投影,立方体贴图上的相应特定位置,任何人都可以帮助我采取哪些步骤或任何全景照片投影?
无论哪种投影最容易做到都足够好,因为有很多资源可用于如何在不同的投影之间进行转换.我只是不知道如何从实际照片到这样的投影.
可以安全地假设摄像机将停留在固定位置,并可以从那里向任何方向旋转.我认为需要这样做的数据可能是这样的:
[-180, +180](例如+ 140deg).[-90, +90](例如-30度).w x h(例如1280x720像素).我有这些数据,我想第一步是进行镜头校正,以便所有应该笔直的线条实际上是直的.而这是可以做到用imagemagick的桶形畸变的 A,B和C:,在其中您只需要填写三个参数.应用于图像以纠正此问题的转换非常简单.
我坚持下一步.要么我不完全理解它,要么搜索引擎没有帮助我,因为大多数结果都是关于在已经给定的投影之间进行转换,或者使用高级应用程序将照片智能地拼接在一起.这些结果并没有帮助我回答我的问题.
编辑:我想,也许一个数字将有助于更好地解释:)
问题是给定的照片红色不能在没有变换的情况下放入等角矩形投影中.下图说明了这个问题.
所以,我有红色,我需要把它变成绿色.蓝色显示转换的差异,但这取决于水平/垂直角度.
camera projection image-processing coordinates coordinate-systems
projection ×10
3d ×2
spring ×2
aggregate ×1
automapper ×1
boolean ×1
camera ×1
coordinates ×1
cqrs ×1
datetime ×1
ef-core-2.0 ×1
event-store ×1
geometry ×1
google-maps ×1
hibernate ×1
javascript ×1
kinect ×1
math ×1
mysql ×1
opengl ×1
performance ×1
polygon ×1
ray-picking ×1
sql ×1
sql-server ×1
union ×1
vector ×1