Mais

Como faço para especificar um CRS para um mapa de jogo fictício no QGIS?


Estou prestes a começar a jogar um jogo de RPG steampunk chamado The Iron Realm, que usa um mapa mundial fictício. Recentemente, comecei a usar o QGIS v1.7 e não tenho experiência real com sistemas GIS. Importei o mapa como uma camada raster para um novo projeto QGIS e criei algumas camadas vetoriais a partir dele, incluindo uma camada de polígono para as regiões, uma camada de ponto para as cidades e uma camada de linha para alguns trilhos de ferrovia e estradas adicionadas.

O mestre do jogo acabou de adicionar uma escala e algumas informações de latitude / longitude ao mapa do jogo:

Presumo a partir disso que agora posso adicionar um CRS ao meu projeto QGIS. Não tenho ideia de como fazer isso e gostaria muito de receber alguma ajuda, para que eu possa usar meu projeto QGIS com o jogo de forma eficaz. Presumo que precisarei criar um CRS personalizado, mas sou completamente ignorante sobre como fazer isso. Acho que tem algo a ver com o proj.4, mas não tenho ideia de como usá-lo.


Há algumas coisas a serem observadas sobre o mapa. Primeiro, as linhas de latitude estão à mesma distância, o que significa que está em uma projeção equirretangular. O resultado disso é que nem as distâncias ou ângulos são preservados, tornando-o não tão útil para a navegação. O segundo ponto é que ele possui uma barra de escala em unidades lineares. Como as distâncias no solo variam de acordo com sua latitude quando visualizadas neste mapa, a escala quase não faz sentido.

No entanto, como este é um mundo de jogo, você tem a liberdade de brincar com ele o quanto quiser. A primeira coisa que você pode fazer é decidir o tamanho do mundo, assumindo que a barra de escala representa as distâncias horizontais no equador. Parece ter cerca de 32 graus em 1000 km, dando-lhe uma circunferência equatorial de 11.250.000m e um raio de 1790493,11m, tornando-o aproximadamente do tamanho da lua. A próxima coisa é que a Terra é aproximadamente um elipsóide, sendo mais plana nos pólos. Para a terra, a razão inversa do raio pólo a pólo e equatorial é de cerca de 298,25, a lua é quase esférica em 800.

Armado com essas informações, você é capaz de criar sua definição proj4:

+ proj = eqc + a = 1790493,11 + lat_ts = 0 + lon_0 = 0 + rf = 800 + unidades = m + no_defs

+ lat_tsnão é estritamente necessário, mas é útil para referência. É a "latitude da escala verdadeira", na qual baseamos nossa circunferência equatorial.+ lon_0representa a longitude do centro do mapa, que neste caso é o meridiano principal.

Abrindo o QGIS e selecionando CRS personalizado…, coloquei nossos parâmetros na caixa de teste e inseri norte 0, leste 32, o que me dá 1.000.000m, que são os 1.000 km que esperávamos para tantos graus no equador. Portanto, vá em frente e crie seu próprio CRS com um nome memorável.

Agora você só precisa georreferenciar o mapa usando o plugin georreferenciador e escolhendo três pontos conhecidos. Quando fiz isso, coloquei um no equador / meridiano principal, um 32 graus (ish) a leste no equador, um 32 graus (ish) ao norte no meridiano principal. Ambos os últimos pontos têm valores xey de 1000000, respectivamente.

E é isso! Como eu disse antes, no entanto, nesta projeção suas distâncias leste-oeste serão cada vez mais imprecisas longe do equador, então pode valer a pena criar mais algumas projeções "locais" para diferentes países, bem como um CRS lat / long, mas isso está ficando um pouco profundo neste estágio. Você pode achar útil ler sobre projeções de mapas (apenas Google) e ler a entrada da Wikipedia para projeções de mapas, que deve lhe dar uma ideia melhor de como tudo funciona.

A propósito, um CRS longo / lat para o seu mundo será simplesmente:

+ proj = lonlat + a = 1790493.11 + rf = 800 + no_defs

Se ele deu a você lat longs (dependendo do formato), existem apenas dois locais que poderiam ser mundiais. Se você tiver o símbolo - na frente do longitutde, haverá apenas um local.

Pensando bem, pode ser que o jogo tenha um elipsóide muito menor que o nosso. Tornando o mundo inteiro circunavegável em menos tempo. Nesse caso, você poderia apenas modificar a altura do elipsóide de wgs84.


Como faço para passar uma variável externa para o Apex em lote?

Eu tenho uma variável de mapa que estou tentando passar para uma classe de lote. Esta variável foi criada e preenchida em outra classe de lote (por isso não posso simplesmente criá-la no método Start () da segunda classe de lote).

A primeira classe de lote implementa Database.Stateful, a fim de preservar os valores que armazeno na variável de mapa. Então, no método Finish (), eu chamo a segunda classe de lote, passando a variável de mapa, assim:

O problema que estou encontrando é que não consigo fazer a segunda classe de lote reconhecer que passei este mapa para ela. Tentei usar a atribuição this.variable na classe do construtor sem deixar claro seu propósito, sem sucesso. Aqui está uma ideia de como essa segunda classe de lote se parece agora:

Neste formato, a classe batch não reconhece mapVariable (diz que não existe). Também tentei tornar essa classe de lote com estado, bem como declarar mapVariable separadamente antes do método start (), semelhante à variável de consulta, que achei que poderia ser necessária para fazer a atribuição this.mapVariable.

Como posso fazer com que esta classe Batch possa usar a variável de mapa que estou tentando passar para ela? Obrigado pela sua ajuda e Feliz Natal / Boas Festas!

Então eu fiz funcionar (ou pelo menos salvei sem erros) declarando a variável do mapa antes do método start () e, em seguida, atribuindo a variável passada a ela, assim:

O interessante é que não funcionou até que eu especificamente tornasse a variável declarada uma variável estática. Meu entendimento é que, embora eu tenha tornado esta classe de lote com estado, as variáveis ​​estáticas são redefinidas a cada lote. Não sei se isso significa que vou perder os valores do mapa após o primeiro lote, mas estou prestes a descobrir!

Se alguém souber por que eu só consegui fazer isso funcionar declarando o mapa estático, adoraria saber o motivo!

Em primeiro lugar, minha 'solução' de EDIT 1 não parece estar funcionando (acho que o mapa que estou usando na minha segunda classe de lote é na verdade um mapa vazio, não o que tentei passar da primeira classe de lote).

De qualquer forma, em resposta a uma solicitação do Crop1645, aqui está a primeira parte do código para minha classe de lote sem qualquer simplificação ou abstração (o que eu fiz em meu primeiro exemplo de código):

Crop, você está certo de que estou recebendo o erro em tempo de compilação (ou seja, quando tento salvar meu código), exceto ao usar o código que mostro aqui, que usa uma declaração estática do mapa e não parece trabalhar de qualquer maneira. O erro simplesmente afirma que "variável: totalLaunchCountMap não existe".


Acho que em vez de usar gluLookAt, você deve simplesmente traduzir a câmera. Não tenho certeza de como você está desenhando suas imagens 2D, mas normalmente você desenhará suas imagens com uma coordenada X e Y e deixará Z em 0. Se você seguir esse caminho, recomendo usar gluOrtho em vez de glPerspective.

Eu recomendo encontrar um bom livro sobre as transformações de visualização do OpenGL. Embora este livro esteja desatualizado, os conceitos neste capítulo permanecem úteis: http://www.glprogramming.com/red/chapter03.html

Primeiro entenda a diferença entre as pilhas de matriz GL_MODELVIEW e GL_PROJECTION.

A matriz GL_MODELVIEW serve para posicionar e orientar os objetos no mundo em relação à câmera. Isso move seus objetos através dos seguintes espaços de coordenadas:

No espaço do objeto, o objeto é o centro de tudo. Ainda não sabe em que parte do mundo está. Em seguida, você aplica a transformação do modelo ao objeto e o posiciona no mundo. Quando isso é feito para todos os objetos, você os tem todos no espaço mundial. Neste ponto, a coordenada (0,0,0) é apenas um ponto de origem arbitrário no mundo.

Sua câmera tem alguma posição e orientação no espaço mundial. A transformação da vista gira e translada o espaço do mundo de forma que a câmera esteja na origem (0,0,0) e olhando ao longo do eixo Z negativo. Este é o espaço ocular. No espaço ocular, a câmera é o centro de tudo.

Essas duas transformações são combinadas em uma, a transformação modelview, uma vez que, na verdade, ambas funcionam juntas para mover objetos ao redor do mundo em relação à câmera.

A matriz GL_PROJECTION transforma seus objetos por meio dos seguintes espaços:

Esta pode ser uma transformação difícil de imaginar conceitualmente. Se você imaginar o tronco da câmera como um volume de 6 faces (que está muito próximo da origem no espaço ocular), essa transformação o move e o deforma para que tenha a forma de um cubo com o centro do cubo em (0,0,0).

O primeiro problema que você tem é que você está tentando aplicar o visualizar transformação para a matriz GL_PROJECTION. Isto é errado. O visualizar a transformação deve fazer parte da matriz GL_MODELVIEW. As transformações de visualização que você está aplicando são glTranslatef e gluLookAt. Eles devem ser aplicados à matriz GL_MODELVIEW.

Seu segundo problema é que você interpretou mal gluLookAt - em particular, o 4º ao 6º argumentos. Você está tentando dar a ele uma direção na qual a câmera deve olhar, (0,0, -1), ao longo do eixo z negativo. Em primeiro lugar, se isso fosse o que gluLookAt esperava, ainda estaria errado, porque você quer que sua câmera olhe ao longo do eixo y. No entanto, ele realmente espera uma posição no mundo para olhar. Não importa onde você coloque sua câmera, ela irá olhar para o ponto (0,0, -1), que por acaso está bem próximo ao canto do seu mapa, que está em (0,0,0).

Você não deveria usar gluLookAt, porque não quer olhar para um ponto específico. Isso é muito mais fácil de fazer com uma rotação para fazer a câmera olhar ao longo do eixo Y negativo, combinada com uma translação para que a câmera fique a uma altura longe do mapa. Observe, você deve aplicar as transformações inversas do que esperava, porque você está realmente movendo o mapa para longe da câmera, e não a câmera para longe do mapa. Algo assim:

Certifique-se de que essas são as primeiras transformações na matriz GL_MODELVIEW.


1 resposta 1

Você tem alguns conceitos errados em seu diagrama.

O mais importante é que ambos suas caixas criptografadas estão erradas, eles deveriam dizer sinal . Na sequência disso, o O CSR enviado ao CA inclui os vários campos (incluindo Assunto) e a chave pública do assunto, não há texto cifrado envolvido, apenas dados simples e uma assinatura.

A chave pública do assunto (no seu caso: requerente) é incluída literalmente no CSR, assim como as informações do assunto. Isso é assinado usando a chave pública do assunto e tudo que é enviado para a CA.

Não em forma de diagrama, mas aqui estão as etapas para construir o CSR e quais dados estão incluídos: As etapas corretas para construir o CSR (não em forma de diagrama) são:

  • Crie um CertificationRequestInfo usando:
    • Nome distinto do assunto
    • Chave pública do assunto
    • Outros atributos
    • CertificationRequestInfo
    • Assinatura
    • Algoritmo de Assinatura

    Observe que o CSR ainda contém CertificationRequestInfo e chave pública do assunto em texto simples .

    Ao receber o CSR, o CA fará mais ou menos o seguinte:

    • analisar o CSR
    • verifique se a assinatura corresponde aos campos do CSR usando a chave pública do assunto
    • verifique se os vários campos correspondem aos seus requisitos (por exemplo: você não pode pedir CN = google.com sem provar que é o proprietário do domínio)
    • elaborar um certificado usando alguns campos do CSR, alguns de si mesmo
    • assine o certificado usando sua chave privada (do emissor)

    O certificado final ainda contém os campos de assunto e a chave pública do assunto.

    Para responder mais especificamente às suas duas perguntas:

    1. a a chave pública do assunto é um dos campos do CSR. Nada é criptografado, apenas assinado.
    2. O campos de assunto são copiados para o certificado final, eles estão lá para qualquer cliente ver.

    Você pode ver uma lista de campos de certificado em RFC5280. Não há hash do CSR porque não há necessidade disso, todas as informações relevantes foram copiadas em seus próprios campos do certificado.


    1 resposta 1

    Para oferecer suporte ao desenho de mapas baseados em blocos de limites arbitrariamente grandes, você deseja adotar a abordagem de não renderizando cada bloco o tempo todo. Você só precisa tentar desenhar o que o jogador pode ver, qualquer outra tentativa de desenhar é uma perda de tempo de processamento e recursos. Esta é uma abordagem agnóstica de API e não importa se você está usando Pygame, cocos2d ou qualquer outra API.

    Para realizar esse feito, você precisa saber algumas informações que são basicamente uma extensão daquelas necessárias para lidar com a rolagem em um jogo de plataforma com rolagem lateral.

    • a posição dentro do mapa global de blocos que o jogador está olhando,
    • o tamanho (em blocos) do visível ao redor centralizado em torno dessa posição de aparência

    A cada atualização, você simplesmente calcula o retângulo delimitador que descreve quais blocos são visíveis com base nessas duas informações e envia apenas aquelas telhas para renderização. Para reutilizar o trecho de código da minha resposta na pergunta vinculada acima, você calcula

    e desenhe apenas as peças delimitadas pelas quatro variáveis ​​acima.

    Se o seu jogo oferece suporte à rolagem suave do mapa de blocos, em vez de rolagem bloco a bloco, você pode querer expandir ligeiramente a largura e altura da janela de visualização para compensar a potencial sobreposição.

    Para renderizar com eficiência o conjunto de blocos que você conhece, você deseja minimizar as mudanças de estado e desenhar chamadas. Idealmente, seus sprites de azulejos reais são armazenados em uma imagem de textura, um tipo específico de atlas de textura onde todas as imagens do atlas cabem na grade. Isso permite que você tenha apenas aquela textura e o limite de sombreador relacionado, minimizando essas alterações de estado.

    Para reduzir as chamadas de desenho, você deseja ter toda a geometria de todos os ladrilhos que renderizará no mínimo possível de buffers de vértice. Se você estiver usando a funcionalidade de renderização de sprite 2D de sua API de nível superior, a maioria deles suportará o batching de geometria (e mudanças de estado, nesse caso) em suas classes de estilo "sprite batch" se eles tiverem membros de tipo inicial e final . Se não, você pode precisar fazer isso manualmente, normalmente usando um buffer de vértice dinâmico que você recarrega com os vértices do ladrilho, coordenadas de textura e assim para todos os ladrilhos apropriados a cada quadro.


    2 respostas 2

    Você tem a entrada de registro correta. Você nem precisa reiniciar.

    Se LogLevel for definido como algo diferente de zero, então todos os Kerberos erros será logado no Sistema log de eventos. Os "sucessos" do Kerberos não são registrados da mesma maneira. (Erros de Kerberos são coisas como AP_ERR_MODIFIED, PRINCIPAL_UNKNOWN, etc.)

    A configuração LogLevel não tem efeito sobre o que aparece no Segurança log de eventos no entanto.

    Sempre funcionou assim. O Server 2012 R2 não é diferente nesse aspecto.

    Por outro lado, se você espera ver eventos de "Sucesso na auditoria" e "Falha na auditoria" mais detalhados para a atividade do tíquete Kerberos em seu log de eventos de segurança que você não está vendo no momento, você precisa configurar sua Política de auditoria avançada . mas Acredito que a maioria desses eventos só são registrados em KDCs / controladores de domínio. (Por exemplo.)


    Para configurar uma linha de abastecimento, você precisa ter o privilégio de Líder Local e um colonizador sobressalente. Entre no modo de oficina e selecione o decantador sobressalente e pressione o botão destacado para Linha de abastecimento

    Isso fornece uma lista de seus assentamentos elegíveis para configurar uma linha de abastecimento com:

    Todas as linhas de abastecimento são visíveis no mapa:

    Você deve ter nivelado o carisma para pelo menos o nível 6, isso pode ser feito indo para regalias

    Desça até o nível 6 e coloque um nível como líder local. O privilégio de líder local permite que você estabeleça linhas de abastecimento entre suas oficinas.

    Vá para qualquer colonizador de um assentamento diferente enquanto estiver no modo de oficina e você verá um botão (Linha de abastecimento) disponível

    Pressionar o botão exibirá uma caixa solicitando que você selecione para qual povoado deseja que o colonizador viaje.

    Para verificar quais assentamentos estão ligados entre si, você pode abrir seu mapa e pressionar (Mostrar linhas de abastecimento)


    Como configurar corretamente a entrada de menu padrão do GRUB 2 correta?

    Compilo meus próprios kernels manualmente e depois os instalo em / boot com make install. Tenho os seguintes kernels em / boot no momento:

    A execução de grub2-mkconfig resulta na seguinte saída:

    Se eu agora ler o arquivo /boot/grub2/grub.cfg resultante, noto que as seguintes entradas foram criadas:

    • Uma entrada padrão principal que inicia vmlinuz-3.7.4-gentoo-third
    • Um submenu com todas as outras entradas (incluindo as de recuperação), na mesma ordem do comando grub2-mkconfig

    O problema é que na hora da inicialização eu gostaria de carregar por padrão a quinta revisão do meu kernel (vmlinuz-3.7.4-gentoo-5), não a terceira (vmlinuz-3.7.4-gentoo-third). Eu também prefiro não acessar o submenu para escolher o kernel certo para carregar.

    Como posso mudar esse comportamento? Como posso dizer ao GRUB que desejo executar a quinta revisão do meu kernel por padrão e não a terceira revisão anterior? Em geral, como posso alterar a linha de entrada padrão para corresponder ao kernel que desejo e não a um aparentemente aleatório escolhido pelo GRUB?

    Também tentei colocar as seguintes linhas em / etc / default / grub:

    Isso não resolve o problema da maneira que desejo. Mas pelo menos o GRUB parece se lembrar do kernel mais recente a partir do qual inicializei e o seleciona automaticamente no submenu. Só que não gosto de acessar o submenu.


    Os métodos de evolução de Leafeon e Glaceon foram alterados. Leafeon agora evolui por Leaf Stone e Glaceon agora evolui por Ice Stone.

    Umbreon e Espeon evoluem noite e dia como antes, no entanto, é importante mencionar que eles evoluem dependendo do que o céu do local real está fazendo - algumas cidades têm um horário fixo do dia, e a evolução refletirá isso, mesmo que não coincide com a hora do mundo real no próprio console do Switch.

    Se você quer um Sylveon, precisa de pelo menos 160 amizade / afeto e conhecer um movimento de fada. Se você quer um Espeon ou Umbreon, precisa de pelo menos 220 amizade / carinho e não deve conhecer um movimento do tipo fada. Veja esta resposta para mais informações sobre as mudanças feitas na amizade / carinho.


    Como configuro o IIS para permitir acesso a recursos de rede para scripts PHP?

    Atualmente, estou trabalhando em um front-end PHP que reúne uma série de aplicativos executados em servidores separados. Muitos desses aplicativos geram arquivos aos quais preciso acessar, mas esses arquivos (por vários motivos) residem em seus servidores-pai.

    Se eu, na linha de comando, emitir um pouco de script, como:

    Vou obter o conteúdo completo desse diretório, provando que não há problema de programação com o PHP ao ler o conteúdo de um compartilhamento UNC. No entanto, se tento executar o mesmo script no servidor da web, obtenho um array vazio - mais especificamente, se uso mais explicitamente funções projetadas para "abrir" um diretório como se fosse um arquivo, recebo erros de acesso.

    Acredito que seja um problema de permissão, mas não sou um tipo de administrador de servidor / rede, então não tenho certeza do que preciso fazer para corrigir isso e colocar meu script em execução, e os links que verifiquei não Tem sido uma ajuda terrível, talvez devido à minha formação, ou à falta dela no que diz respeito ao IIS, juntamente com o fato de que não estamos realmente usando .NET para isso.

    Estatísticas relevantes: Windows Server 2008 Standard SP2 IIS 7.0 PHP 5.2.9

    Estarei me conectando a dois tipos de servidores: algumas outras máquinas Server 2008 quase idênticas e uma máquina executando XP embarcado.

    Links que não foram particularmente úteis, mas talvez eu esteja apenas interpretando mal:


    6 Respostas 6

    As selvas no Minecraft tornaram-se muito mais raras na atualização 1.7, então, se você as estiver usando, elas serão muito mais difíceis de encontrar. No entanto, os biomas agora se colocarão próximos a outros biomas do mesmo clima e, como as selvas são quentes, você deve procurar perto de desertos, mesas e savanas. Os templos dentro dessas selvas são difíceis de encontrar, e nem todas as selvas os têm. Pode ajudar queimar algumas das árvores, pois, como o templo é feito de pedra, estará a salvo de queimaduras. Além de usar mods ou sementes, isso é realmente o melhor que você pode fazer.

    A estrutura do mundo não é algo que você possa descobrir com 100% de segurança sem uma ferramenta. Existe uma função matemática em funcionamento que usa a semente para calcular como o mundo será.

    Para descobrir qual bioma estará em um determinado local com 100% de segurança, você terá que fazer o mesmo cálculo que o gerador de mundo no minecraft está fazendo. O problema é que você não será capaz de dizer "dê-me a selva mais próxima". Você terá que gerar o mundo ao seu redor e então olhar se existe uma selva. Mas de qualquer forma, você precisará usar uma ferramenta externa para fazer esse cálculo, já que é bastante complicado e o minecraft não tem nenhuma ferramenta interna que possa ajudá-lo nisso.

    O que você precisa no final é algo que use a semente e o motor de geração de sua versão atual do minecraft e tente visualizar uma determinada área (como AMIDST) ou uma ferramenta que olhe para mapas já gerados, como uma ferramenta de mapeamento.


    Assista o vídeo: Criando um mapa temático do zero no QGIS mapa de biomas (Outubro 2021).